docs: Update documentation with iterative solver changes
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
		| @@ -163,28 +163,37 @@ provides further information on the mechanics of moves. | ||||
|   kinematic class is given a chance to audit the move | ||||
|   (`ToolHead.move() -> kin.check_move()`) before it goes on the | ||||
|   look-ahead queue, but once the move arrives in *kin*.move() the | ||||
|   kinematic class is required to handle the move as specified. The | ||||
|   kinematic classes translate the three parts of each move | ||||
|   (acceleration, constant "cruising" velocity, and deceleration) to | ||||
|   the associated movement on each stepper. Note that the extruder is | ||||
|   handled in its own kinematic class. Since the Move() class specifies | ||||
|   the exact movement time and since step pulses are sent to the | ||||
|   micro-controller with specific timing, stepper movements produced by | ||||
|   the extruder class will be in sync with head movement even though | ||||
|   the code is kept separate. | ||||
|   kinematic class is required to handle the move as specified. Note | ||||
|   that the extruder is handled in its own kinematic class. Since the | ||||
|   Move() class specifies the exact movement time and since step pulses | ||||
|   are sent to the micro-controller with specific timing, stepper | ||||
|   movements produced by the extruder class will be in sync with head | ||||
|   movement even though the code is kept separate. | ||||
|  | ||||
| * For efficiency reasons, the stepper pulse times are generated in C | ||||
|   code. The code flow is: `kin.move() -> MCU_Stepper.step_const() -> | ||||
|   stepcompress_push_const()`, or for delta kinematics: | ||||
|   `DeltaKinematics.move() -> MCU_Stepper.step_delta() -> | ||||
|   stepcompress_push_delta()`. The MCU_Stepper code just performs unit | ||||
|   and axis transformation (millimeters to step distances), and calls | ||||
|   the C code. The C code calculates the stepper step times for each | ||||
|   movement and fills an array (struct stepcompress.queue) with the | ||||
|   corresponding micro-controller clock counter times for every | ||||
|   step. Here the "micro-controller clock counter" value directly | ||||
|   corresponds to the micro-controller's hardware counter - it is | ||||
|   relative to when the micro-controller was last powered up. | ||||
| * Klipper uses an | ||||
|   [iterative solver](https://en.wikipedia.org/wiki/Root-finding_algorithm) | ||||
|   to generate the step times for each stepper. For efficiency reasons, | ||||
|   the stepper pulse times are generated in C code. The code flow is: | ||||
|   `kin.move() -> MCU_Stepper.step_itersolve() -> | ||||
|   itersolve_gen_steps()` (in klippy/chelper/itersolve.c). The goal of | ||||
|   the iterative solver is to find step times given a formula that | ||||
|   calculates a stepper position from a given time in a move. This is | ||||
|   done by repeatedly "guessing" various times until the stepper | ||||
|   position formula returns the desired position of the next step on | ||||
|   the stepper. The feedback produced from each guess is used to | ||||
|   improve future guesses so that the process rapidly converges to the | ||||
|   desired time. The kinematic stepper position formulas are located in | ||||
|   the klippy/chelper/ directory (eg, kin_cart.c, kin_corexy.c, | ||||
|   kin_delta.c, kin_extruder.c). | ||||
|  | ||||
| * After the iterative solver calculates the step times they are added | ||||
|   to an array: `itersolve_gen_steps() -> queue_append()` (in | ||||
|   klippy/chelper/stepcompress.c). The array (struct | ||||
|   stepcompress.queue) stores the corresponding micro-controller clock | ||||
|   counter times for every step. Here the "micro-controller clock | ||||
|   counter" value directly corresponds to the micro-controller's | ||||
|   hardware counter - it is relative to when the micro-controller was | ||||
|   last powered up. | ||||
|  | ||||
| * The next major step is to compress the steps: `stepcompress_flush() | ||||
|   -> compress_bisect_add()` (in klippy/chelper/stepcompress.c). This | ||||
| @@ -293,8 +302,7 @@ This section provides some tips on adding support to Klipper for | ||||
| additional types of printer kinematics. This type of activity requires | ||||
| excellent understanding of the math formulas for the target | ||||
| kinematics. It also requires software development skills - though one | ||||
| should only need to update the host software (which is written in | ||||
| Python). | ||||
| should only need to update the host software. | ||||
|  | ||||
| Useful steps: | ||||
| 1. Start by studying the | ||||
| @@ -304,74 +312,30 @@ Useful steps: | ||||
|    and delta.py. The kinematic classes are tasked with converting a | ||||
|    move in cartesian coordinates to the movement on each stepper. One | ||||
|    should be able to copy one of these files as a starting point. | ||||
| 3. Implement the `get_postion()` method in the new kinematics | ||||
|    class. This method converts the current stepper position of each | ||||
|    stepper axis (stored in millimeters) to a position in cartesian | ||||
|    space (also in millimeters). | ||||
| 4. Implement the `set_postion()` method. This is the inverse of | ||||
|    get_position() - it sets each axis position (in millimeters) given | ||||
|    a position in cartesian coordinates. | ||||
| 5. Implement the `move()` method. The goal of the move() method is to | ||||
|    convert a move defined in cartesian space to a series of stepper | ||||
|    step times that implement the requested movement. | ||||
|    * The `move()` method is passed a "print_time" parameter (which | ||||
|      stores a time in seconds) and a "move" class instance that fully | ||||
|      defines the movement. The goal is to repeatedly invoke the | ||||
|      `stepper.step()` method with the time (relative to print_time) | ||||
|      that each stepper should step at to obtain the desired motion. | ||||
|    * One "trick" to help with the movement calculations is to imagine | ||||
|      there is a physical rail between `move.start_pos` and | ||||
|      `move.end_pos` that confines the print head so that it can only | ||||
|      move along this straight line of motion. Then, if the head is | ||||
|      confined to that imaginary rail, the head is at `move.start_pos`, | ||||
|      only one stepper is enabled (all other steppers can move freely), | ||||
|      and the given stepper is stepped a single step, then one can | ||||
|      imagine that the head will move along the line of movement some | ||||
|      distance. Determine the formula converting this step distance to | ||||
|      distance along the line of movement. Once one has the distance | ||||
|      along the line of movement, one can figure out the time that the | ||||
|      head should be at that position (using the standard formulas for | ||||
|      velocity and acceleration). This time is the ideal step time for | ||||
|      the given stepper and it can be passed to the `stepper.step()` | ||||
|      method. | ||||
|    * The `stepper.step()` method must always be called with an | ||||
|      increasing time for a given stepper (steps must be scheduled in | ||||
|      the order they are to be executed). A common error during | ||||
|      kinematic development is to receive an "Internal error in | ||||
|      stepcompress" failure - this is generally due to the step() | ||||
|      method being invoked with a time earlier than the last scheduled | ||||
|      step. For example, if the last step in move1 is scheduled at a | ||||
|      time greater than the first step in move2 it will generally | ||||
|      result in the above error. | ||||
|    * Fractional steps. Be aware that a move request is given in | ||||
|      cartesian space and it is not confined to discreet | ||||
|      locations. Thus a move's start and end locations may translate to | ||||
|      a location on a stepper axis that is between two steps (a | ||||
|      fractional step). The code must handle this. The preferred | ||||
|      approach is to schedule the next step at the time a move would | ||||
|      position the stepper axis at least half way towards the next | ||||
|      possible step location. Incorrect handling of fractional steps is | ||||
|      a common cause of "Internal error in stepcompress" failures. | ||||
| 6. Other methods. The `home()`, `check_move()`, and other methods | ||||
| 3. Implement the C stepper kinematic position functions for each | ||||
|    stepper if they are not already available (see kin_cart.c, | ||||
|    kin_corexy.c, and kin_delta.c in klippy/chelper/). The function | ||||
|    should call `move_get_coord()` to convert a given move time (in | ||||
|    seconds) to a cartesian coordinate (in millimeters), and then | ||||
|    calculate the desired stepper position (in millimeters) from that | ||||
|    cartesian coordinate. | ||||
| 4. Implement the `set_position()` method in the python code. This also | ||||
|    calculates the desired stepper positions given a cartesian | ||||
|    coordinate. | ||||
| 5. Implement the `get_position()` method in the new kinematics | ||||
|    class. This method is the inverse of set_position(). It does not | ||||
|    need to be efficient as it is typically only called during homing | ||||
|    and probing operations. | ||||
| 6. Implement the `move()` method. This method generally invokes the | ||||
|    iterative solver for each stepper. | ||||
| 7. Other methods. The `home()`, `check_move()`, and other methods | ||||
|    should also be implemented. However, at the start of development | ||||
|    one can use empty code here. | ||||
| 7. Implement test cases. Create a g-code file with a series of moves | ||||
| 8. Implement test cases. Create a g-code file with a series of moves | ||||
|    that can test important cases for the given kinematics. Follow the | ||||
|    [debugging documentation](Debugging.md) to convert this g-code file | ||||
|    to micro-controller commands. This is useful to exercise corner | ||||
|    cases and to check for regressions. | ||||
| 8. Optimize if needed. One may notice that the existing kinematic | ||||
|    classes do not call `stepper.step()`. This is purely an | ||||
|    optimization - the inner loop of the kinematic calculations were | ||||
|    moved to C to reduce load on the host cpu. All of the existing | ||||
|    kinematic classes started development using `stepper.step()` and | ||||
|    then were later optimized. The g-code to mcu command translation | ||||
|    (described in the previous step) is a useful tool during | ||||
|    optimization - if a code change is purely an optimization then it | ||||
|    should not impact the resulting text representation of the mcu | ||||
|    commands (though minor changes in output due to floating point | ||||
|    rounding are possible). So, one can use this system to detect | ||||
|    regressions. | ||||
|  | ||||
| Time | ||||
| ==== | ||||
|   | ||||
| @@ -139,15 +139,32 @@ tracked in millimeters, seconds, and in cartesian coordinate space. | ||||
| It's the task of the kinematic classes to convert from this generic | ||||
| coordinate system to the hardware specifics of the particular printer. | ||||
|  | ||||
| In general, the code determines each step time by first calculating | ||||
| where along the line of movement the head would be if a step is | ||||
| taken. It then calculates what time the head should be at that | ||||
| position. Determining the time along the line of movement can be done | ||||
| using the formulas for constant acceleration and constant velocity: | ||||
| Klipper uses an | ||||
| [iterative solver](https://en.wikipedia.org/wiki/Root-finding_algorithm) | ||||
| to generate the step times for each stepper. The code contains the | ||||
| formulas to calculate the ideal cartesian coordinates of the head at | ||||
| each moment in time, and it has the kinematic formulas to calculate | ||||
| the ideal stepper positions based on those cartesian coordinates. With | ||||
| these formulas, Klipper can determine the ideal time that the stepper | ||||
| should be at each step position. The given steps are then scheduled at | ||||
| these calculated times. | ||||
|  | ||||
| The key formula to determine how far a move should travel under | ||||
| constant acceleration is: | ||||
| ``` | ||||
| time = sqrt(2*distance/accel + (start_velocity/accel)^2) - start_velocity/accel | ||||
| time = distance/cruise_velocity | ||||
| move_distance = (start_velocity + .5 * accel * move_time) * move_time | ||||
| ``` | ||||
| and the key formula for movement with constant velocity is: | ||||
| ``` | ||||
| move_distance = cruise_velocity * move_time | ||||
| ``` | ||||
|  | ||||
| The key formulas for determining the cartesian coordinate of a move | ||||
| given a move distance is: | ||||
| ``` | ||||
| cartesian_x_position = start_x + move_distance * total_x_movement / total_movement | ||||
| cartesian_y_position = start_y + move_distance * total_y_movement / total_movement | ||||
| cartesian_z_position = start_z + move_distance * total_z_movement / total_movement | ||||
| ``` | ||||
|  | ||||
| Cartesian Robots | ||||
| @@ -157,54 +174,35 @@ Generating steps for cartesian printers is the simplest case. The | ||||
| movement on each axis is directly related to the movement in cartesian | ||||
| space. | ||||
|  | ||||
| Key formulas: | ||||
| ``` | ||||
| stepper_x_position = cartesian_x_position | ||||
| stepper_y_position = cartesian_y_position | ||||
| stepper_z_position = cartesian_z_position | ||||
| ``` | ||||
|  | ||||
| CoreXY Robots | ||||
| ---------------- | ||||
|  | ||||
| Generating steps on a CoreXY machine is only a little more complex | ||||
| than basic cartesian robots. The key formulas are: | ||||
| ``` | ||||
| stepper_a_position = cartesian_x_position + cartesian_y_position | ||||
| stepper_b_position = cartesian_x_position - cartesian_y_position | ||||
| stepper_z_position = cartesian_z_position | ||||
| ``` | ||||
|  | ||||
| Delta Robots | ||||
| ------------ | ||||
|  | ||||
| To generate step times on Delta printers it is necessary to correlate | ||||
| the movement in cartesian space with the movement on each stepper | ||||
| tower. | ||||
|  | ||||
| To simplify the math, for each stepper tower, the code calculates the | ||||
| location of a "virtual tower" that is along the line of movement. | ||||
| This virtual tower is chosen at the point where the line of movement | ||||
| (extended infinitely in both directions) would be closest to the | ||||
| actual tower. | ||||
|  | ||||
|  | ||||
|  | ||||
| It is then possible to calculate where the head will be along the line | ||||
| of movement after each step is taken on the virtual tower. | ||||
|  | ||||
|  | ||||
|  | ||||
| The key formula is Pythagoras's theorem: | ||||
| Step generation on a delta robot is based on Pythagoras's theorem: | ||||
| ``` | ||||
| distance_to_tower^2 = arm_length^2 - tower_height^2 | ||||
| stepper_position = (sqrt(arm_length^2 | ||||
|                          - (cartesian_x_position - tower_x_position)^2 | ||||
|                          - (cartesian_y_position - tower_y_position)^2) | ||||
|                     + cartesian_z_position) | ||||
| ``` | ||||
|  | ||||
| One complexity is that if the print head passes the virtual tower | ||||
| location then the stepper direction must be reversed. In this case | ||||
| forward steps will be taken at the start of the move and reverse steps | ||||
| will be taken at the end of the move. | ||||
|  | ||||
| ### Delta movements beyond simple XY plane ### | ||||
|  | ||||
| Movement calculation is more complicated if a single move contains | ||||
| both XY movement and Z movement. These moves are rare, but they must | ||||
| still be handled correctly. A virtual tower along the line of movement | ||||
| is still calculated, but in this case the tower is not at a 90 degree | ||||
| angle relative to the line of movement: | ||||
|  | ||||
|  | ||||
|  | ||||
| The code continues to calculate step times using the same general | ||||
| scheme as delta moves within an XY plane, but the slope of the tower | ||||
| must also be used in the calculations. | ||||
|  | ||||
| Should the move contain only Z movement (ie, no XY movement at all) | ||||
| then the same math is used - just in this case the tower is parallel | ||||
| to the line of movement. | ||||
|  | ||||
| ### Stepper motor acceleration limits ### | ||||
|  | ||||
| With delta kinematics it is possible for a move that is accelerating | ||||
| @@ -236,8 +234,10 @@ independently from the step time calculations of the print head | ||||
| movement. | ||||
|  | ||||
| Basic extruder movement is simple to calculate. The step time | ||||
| generation uses the same constant acceleration and constant velocity | ||||
| formulas that cartesian robots use. | ||||
| generation uses the same formulas that cartesian robots use: | ||||
| ``` | ||||
| stepper_position = requested_e_position | ||||
| ``` | ||||
|  | ||||
| ### Pressure advance ### | ||||
|  | ||||
| @@ -264,7 +264,7 @@ through the nozzle orifice (as in | ||||
| key idea is that the relationship between filament, pressure, and flow | ||||
| rate can be modeled using a linear coefficient: | ||||
| ``` | ||||
| extra_filament = pressure_advance_coefficient * extruder_velocity | ||||
| stepper_position = requested_e_position + pressure_advance_coefficient * nominal_extruder_velocity | ||||
| ``` | ||||
|  | ||||
| See the [pressure advance](Pressure_Advance.md) document for | ||||
|   | ||||
| @@ -1,273 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
|  | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="97.22496mm" | ||||
|    height="32.550285mm" | ||||
|    viewBox="0 0 344.49789 115.33566" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="delta-tower.svg"> | ||||
|   <defs | ||||
|      id="defs4"> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6618" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend"> | ||||
|       <path | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6620" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0.0" | ||||
|        refX="0.0" | ||||
|        id="marker6500" | ||||
|        style="overflow:visible;" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path6502" | ||||
|          d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||||
|          style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1" | ||||
|          transform="scale(0.4) rotate(180) translate(10,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible;" | ||||
|        id="marker6082" | ||||
|        refX="0.0" | ||||
|        refY="0.0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          transform="scale(0.4) rotate(180) translate(10,0)" | ||||
|          style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1" | ||||
|          d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||||
|          id="path6084" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0.0" | ||||
|        refX="0.0" | ||||
|        id="Arrow1Mend" | ||||
|        style="overflow:visible;" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          id="path5747" | ||||
|          d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||||
|          style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1" | ||||
|          transform="scale(0.4) rotate(180) translate(10,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mstart" | ||||
|        orient="auto" | ||||
|        refY="0.0" | ||||
|        refX="0.0" | ||||
|        id="Arrow1Mstart" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path5744" | ||||
|          d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||||
|          style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1" | ||||
|          transform="scale(0.4) translate(10,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mend-1" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4329-1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6082-9" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6084-2" /> | ||||
|     </marker> | ||||
|   </defs> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1.75" | ||||
|      inkscape:cx="172.24895" | ||||
|      inkscape:cy="45.708959" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      inkscape:window-width="928" | ||||
|      inkscape:window-height="628" | ||||
|      inkscape:window-x="162" | ||||
|      inkscape:window-y="50" | ||||
|      inkscape:window-maximized="0" | ||||
|      fit-margin-top="0" | ||||
|      fit-margin-left="0" | ||||
|      fit-margin-right="0" | ||||
|      fit-margin-bottom="0" | ||||
|      showborder="false" | ||||
|      inkscape:snap-global="false" | ||||
|      showguides="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid3436" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title /> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(-135.22429,-249.96955)"> | ||||
|     <ellipse | ||||
|        style="fill:#4d4d4d;stroke:#4b4b4b;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:2, 1, 0.5, 1;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="path4255" | ||||
|        cx="353.79568" | ||||
|        cy="327.87662" | ||||
|        rx="4.2857141" | ||||
|        ry="4.8571429" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" | ||||
|        d="M 181.50998,381.87664 359.22427,275.01949" | ||||
|        id="path5510" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="371.22427" | ||||
|        y="354.44806" | ||||
|        id="text6058" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6060" | ||||
|          x="371.22427" | ||||
|          y="354.44806">stepper</tspan><tspan | ||||
|          sodipodi:role="line" | ||||
|          x="371.22427" | ||||
|          y="366.94806" | ||||
|          id="tspan9337">tower</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="166.65283" | ||||
|        y="304.16235" | ||||
|        id="text6062" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6064" | ||||
|          x="166.65283" | ||||
|          y="304.16235">line of movement</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-weight:normal;font-size:10.0000006px;line-height:125%;font-family:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'DejaVu Sans, Normal';font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;" | ||||
|        x="252.93855" | ||||
|        y="384.16235" | ||||
|        id="text6066" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6068" | ||||
|          x="252.93855" | ||||
|          y="384.16235">move</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker6618)" | ||||
|        d="m 382.65284,344.73378 c -0.19273,-13.52091 -9.87887,-14.83602 -20.57143,-14.85715" | ||||
|        id="path6070" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker6500)" | ||||
|        d="m 254.65284,374.44806 c 3.39239,-12.86009 -2.06023,-20.09154 -15.42857,-22.28571" | ||||
|        id="path6072" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)" | ||||
|        d="m 257.50997,296.16234 c 31.05376,-3.13332 32.38959,-1.23784 42.28572,10.28572" | ||||
|        id="path6074" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)" | ||||
|        d="m 219.61431,358.80126 57.78715,-34.48307" | ||||
|        id="path3514-5" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:0.50000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" | ||||
|        d="m 351.22427,323.59092 -20.57143,-32" | ||||
|        id="path3358" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="244.36713" | ||||
|        y="257.30521" | ||||
|        id="text4460" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan4462" | ||||
|          x="244.36713" | ||||
|          y="257.30521">virtual tower</tspan><tspan | ||||
|          sodipodi:role="line" | ||||
|          x="244.36713" | ||||
|          y="269.80521" | ||||
|          id="tspan5867">location</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082-9)" | ||||
|        d="m 310.90661,257.14111 c 21.29088,8.40268 18.35244,16.28958 20.57143,29.7143" | ||||
|        id="path6074-6" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 11 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 8.2 KiB | 
| @@ -1,241 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
|  | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="64.619751mm" | ||||
|    height="27.45583mm" | ||||
|    viewBox="0 0 228.96762 97.284438" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="virtual-tower.svg"> | ||||
|   <defs | ||||
|      id="defs4"> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6618" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend"> | ||||
|       <path | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6620" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="marker6500" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path6502" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mend" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          id="path5747" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mstart" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mstart" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path5744" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(0.4,0,0,0.4,4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mend-1" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4329-1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6082" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6084" /> | ||||
|     </marker> | ||||
|   </defs> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1.75" | ||||
|      inkscape:cx="169.7719" | ||||
|      inkscape:cy="-4.0565054" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      inkscape:window-width="922" | ||||
|      inkscape:window-height="628" | ||||
|      inkscape:window-x="162" | ||||
|      inkscape:window-y="50" | ||||
|      inkscape:window-maximized="0" | ||||
|      fit-margin-top="0" | ||||
|      fit-margin-left="0" | ||||
|      fit-margin-right="0" | ||||
|      fit-margin-bottom="0" | ||||
|      showborder="false" | ||||
|      inkscape:snap-global="false" | ||||
|      showguides="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid3436" | ||||
|        originx="-14.085234" | ||||
|        originy="-95.286988" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(-149.30952,-172.73378)"> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" | ||||
|        d="m 176.36712,256.16235 200.00001,-0.57143" | ||||
|        id="path5510" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="-254.01012" | ||||
|        y="369.20834" | ||||
|        id="text6058" | ||||
|        sodipodi:linespacing="125%" | ||||
|        transform="matrix(-0.01833576,-0.99983189,0.99983189,-0.01833576,0,0)" | ||||
|        inkscape:transform-center-x="-8.0000002" | ||||
|        inkscape:transform-center-y="12.571429"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan10365" | ||||
|          x="-254.01012" | ||||
|          y="369.20834">virtual tower</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="148.36713" | ||||
|        y="269.87662" | ||||
|        id="text6062" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6064" | ||||
|          x="148.36713" | ||||
|          y="269.87662">line of movement</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="237.50998" | ||||
|        y="251.01949" | ||||
|        id="text6066" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6068" | ||||
|          x="237.50998" | ||||
|          y="251.01949">move</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="m 358.08141,255.01949 0,-82.28571" | ||||
|        id="path10351" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="M 220.36713,255.01949 357.50998,173.30521" | ||||
|        id="path10373" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="200.36713" | ||||
|        y="187.59093" | ||||
|        id="text10375" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan10377" | ||||
|          x="200.36713" | ||||
|          y="187.59093">virtual arm</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)" | ||||
|        d="m 261.76375,182.85539 c 22.73118,-0.70136 26.45506,3.7437 40.00001,18.28573" | ||||
|        id="path6074" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)" | ||||
|        d="m 219.61431,255.37268 70.93001,0.37408" | ||||
|        id="path3514-5" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 9.5 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 5.7 KiB | 
| @@ -1,241 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
|  | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="64.619751mm" | ||||
|    height="27.45583mm" | ||||
|    viewBox="0 0 228.96762 97.284438" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="xy+z-tower.svg"> | ||||
|   <defs | ||||
|      id="defs4"> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6618" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend"> | ||||
|       <path | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6620" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="marker6500" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path6502" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mend" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          id="path5747" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mstart" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mstart" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true"> | ||||
|       <path | ||||
|          id="path5744" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(0.4,0,0,0.4,4,0)" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        orient="auto" | ||||
|        refY="0" | ||||
|        refX="0" | ||||
|        id="Arrow1Mend-1" | ||||
|        style="overflow:visible" | ||||
|        inkscape:isstock="true" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4329-1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" /> | ||||
|     </marker> | ||||
|     <marker | ||||
|        inkscape:isstock="true" | ||||
|        style="overflow:visible" | ||||
|        id="marker6082" | ||||
|        refX="0" | ||||
|        refY="0" | ||||
|        orient="auto" | ||||
|        inkscape:stockid="Arrow1Mend" | ||||
|        inkscape:collect="always"> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          transform="matrix(-0.4,0,0,-0.4,-4,0)" | ||||
|          style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1" | ||||
|          d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" | ||||
|          id="path6084" /> | ||||
|     </marker> | ||||
|   </defs> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1.75" | ||||
|      inkscape:cx="169.7719" | ||||
|      inkscape:cy="-4.0565054" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      inkscape:window-width="922" | ||||
|      inkscape:window-height="628" | ||||
|      inkscape:window-x="162" | ||||
|      inkscape:window-y="50" | ||||
|      inkscape:window-maximized="0" | ||||
|      fit-margin-top="0" | ||||
|      fit-margin-left="0" | ||||
|      fit-margin-right="0" | ||||
|      fit-margin-bottom="0" | ||||
|      showborder="false" | ||||
|      inkscape:snap-global="false" | ||||
|      showguides="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid3436" | ||||
|        originx="-14.085234" | ||||
|        originy="-95.286988" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(-149.30952,-172.73378)"> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" | ||||
|        d="m 176.36712,256.16235 200.00001,-0.57143" | ||||
|        id="path5510" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="-119.27526" | ||||
|        y="434.37329" | ||||
|        id="text6058" | ||||
|        sodipodi:linespacing="125%" | ||||
|        transform="matrix(0.32454206,-0.94587127,0.94587127,0.32454206,0,0)" | ||||
|        inkscape:transform-center-x="-3.9400734" | ||||
|        inkscape:transform-center-y="14.789029"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan10365" | ||||
|          x="-119.27526" | ||||
|          y="434.37329">virtual tower</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="148.36713" | ||||
|        y="269.87662" | ||||
|        id="text6062" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6064" | ||||
|          x="148.36713" | ||||
|          y="269.87662">line of movement</tspan></text> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="237.50998" | ||||
|        y="251.01949" | ||||
|        id="text6066" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan6068" | ||||
|          x="237.50998" | ||||
|          y="251.01949">move</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="m 354.70239,255.76769 28.12779,-77.32895" | ||||
|        id="path10351" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="M 220.36713,255.01949 380.93855,178.44807" | ||||
|        id="path10373" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <text | ||||
|        xml:space="preserve" | ||||
|        style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        x="200.36713" | ||||
|        y="187.59093" | ||||
|        id="text10375" | ||||
|        sodipodi:linespacing="125%"><tspan | ||||
|          sodipodi:role="line" | ||||
|          id="tspan10377" | ||||
|          x="200.36713" | ||||
|          y="187.59093">virtual arm</tspan></text> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)" | ||||
|        d="m 261.76375,182.85539 c 22.73118,-0.70136 26.45506,3.7437 40.00001,18.28573" | ||||
|        id="path6074" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)" | ||||
|        d="m 219.61431,255.37268 70.93001,0.37408" | ||||
|        id="path3514-5" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 9.5 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 6.5 KiB | 
		Reference in New Issue
	
	Block a user