¿Cómo corregir este bloque de diagrama?

¿Cómo corregir este bloque de diagrama?

ingrese la descripción de la imagen aquí

\tikzstyle{block} = [draw, fill=blue!20, rectangle, 
minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=blue!20, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]

% The block diagram code is probably more verbose than necessary
\begin{tikzpicture}[auto, node distance=2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input] (sum) {};
\node [block, right of=sum] (controller) {Controller};
\node [block, right of=controller, pin={[pinstyle]above:Disturbances},
node distance=3cm] (system) {System};
% We draw an edge between the controller and system block to 
% calculate the coordinate u. We need it to place the measurement block. 
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right of=system] (output) {};
\node [block, below of=system] (measurements) {Measurements};
\node [block, left of=measurements ] (sensor) {Sensor};
\draw [<-] (measurements) -- node[name=k] {$k$} (sensor);
% Once the nodes are placed, connecting them is easy. 
\draw [draw,->] (input) -- node {$r$} (sum);
\draw [->] (sum) -- node {$e$} (controller);
\draw [->] (system) -- node [name=y] {$y$}(output);
\draw [->] (y) |- (measurements);
\draw [->] (sensor) -| node[pos=0.99] {$-$} 
node [near end] {$y_m$} (sum);
\end{tikzpicture}

Respuesta1

Sustituir left of=measurementspor below=of controller.

Tres notas menores:

  • Las claves left of, right ofetc. están en desuso. Ahora se recomienda utilizar left=of ...en lugar de left of=...etc. Esto requiere \usetikzlibrary{positioning}. Este cambio es más que una transposición de letras. El nuevo posicionamiento es más sólido y flexible que el antiguo.

  • Puedes escribir block/.style = {...}(como opción tikzpictureo como argumento para \tikzset) en lugar de \tikzstyle{block} = [...]. Según tengo entendido, el primer método (que también utilicé a continuación) está más en línea con las convenciones actuales de tikz. El segundo método es una sintaxis bastante singular que no se utiliza en ningún otro lugar de tikz.

  • Como Zarko ha señalado en los comentarios, la distancia del nodo se puede elegir de manera diferente en las direcciones x e y especificando, por ejemplo node distance=1cm and 2cm, .

ingrese la descripción de la imagen aquí

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}
\tikzset
  {block/.style =
    {draw, fill=blue!20, rectangle, minimum height=3em, minimum width=6em},
   sum/.style = {draw, fill=blue!20, circle, node distance=1cm},
   input/.style = {coordinate},
   output/.style = {coordinate},
   pinstyle/.style = {pin edge={to-,thin,black}}
  }

\begin{document}
% The block diagram code is probably more verbose than necessary
\begin{tikzpicture}[auto, node distance=1cm and 2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right=of input] (sum) {};
\node [block, right=of sum] (controller) {Controller};
\node [block, right=of controller, pin={[pinstyle]above:Disturbances},
node distance=3cm] (system) {System};
% We draw an edge between the controller and system block to 
% calculate the coordinate u. We need it to place the measurement block. 
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right=of system] (output) {};
\node [block, below=of system] (measurements) {Measurements};
\node [block, below=of controller] (sensor) {Sensor};
\draw [<-] (measurements) -- node[name=k] {$k$} (sensor);
% Once the nodes are placed, connecting them is easy. 
\draw [draw,->] (input) -- node {$r$} (sum);
\draw [->] (sum) -- node {$e$} (controller);
\draw [->] (system) -- node [name=y] {$y$}(output);
\draw [->] (y) |- (measurements);
\draw [->] (sensor) -| node[pos=0.99] {$-$} 
node [near end] {$y_m$} (sum);
\end{tikzpicture}
\end{document}

Respuesta2

Como complemento agernot(no tanto) respuesta "detallada", espero que sea más concisa :) En ella uso calcuna quotesbiblioteca:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows, calc, positioning, quotes}
\tikzset{
     block/.style = {rectangle, draw, fill=blue!20, minimum height=3em, minimum width=6em},
       sum/.style = {circle, draw, fill=blue!20},
 every pin/.style = {pin edge={<-,black}},
                > = latex'
        }

\begin{document}
    \begin{tikzpicture}[auto, 
    node distance = 6mm and 12mm]
% placing the blocks
\coordinate (in);
\node (sum)             [sum, right=of in] {};
\node (controller)      [block, right=of sum]           {Controller};
\node (system)          [block, pin=above:Disturbances, 
                         right=of controller]           {System};
\coordinate[right=of system] (out);
\node (measurement)     [block, below=of controller]    {Measurements};
\node (sensor)          [block, below=of system]        {Sensor};
% edges between blocks
\draw[->]   (in)            edge ["$r$"] (sum)
            (sum)           edge ["$e$"] (controller)
            (controller)    edge["$u$"]  (system)
            (system)        edge["$y$"]  (out)
            (sensor)        edge["$k$"] (measurement)
            (measurement)   -|  (sum)
                            node [pos=0.75] {$y_m$}
                            node [pos=0.95] {$-$};
\draw[->]   ($(system.east)!0.5!(out)$) |- (sensor);
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Editar:Cambio considerandoCarLaTeXcomentario, los comentarios en el código ahora son más significativos. Sigo creyendo que el orden sugerido de los bloques "sensor" y "medición" es correcto. Sin embargo, hasta que estos bloques sean lineales, el orden no es esencial :)

Respuesta3

Creo que también podrías usar un TikZ matrix.

Tenga en cuenta que arrowsla biblioteca está en desuso. Del Manual de TikZ y PGF, párr. 16.1:

Observación: Las bibliotecas flechas y flechas.espaciadas están en desuso. Utilice flechas.meta en su lugar/además, lo que le permite hacer todo lo que ofrecían las bibliotecas antiguas, y mucho más. Sin embargo, las bibliotecas antiguas todavía funcionan e incluso puedes mezclar puntas de flecha antiguas y nuevas (solo que las puntas de flecha antiguas no se pueden configurar de la forma descrita en el resto de esta sección; decir escala=2 para una flecha de látex no tiene ningún efecto para Por ejemplo, mientras que para las flechas de látex duplica su tamaño como era de esperar).

Además, como ya dijo gernot, \tikzsetdebería usarse en lugar de\tikzstyle (veraquí).

\documentclass{book}
\usepackage{tikz}   
\usetikzlibrary{arrows.meta,matrix,positioning}

\begin{document}

\tikzset{%
    block/.style={draw, fill=blue!20, rectangle, 
    minimum height=3em, text width=7em,align=center},
    sum/.style={draw, fill=blue!20, circle},
    pinstyle/.style={pin edge={latex-,thin,black}},
    mylabup/.style={midway,above},
    >=latex,
    }   
\begin{tikzpicture}
    \matrix[column sep=3em, row sep=4ex]{%
    \coordinate (input);
    &
    \node [sum] (sum) {};
    &
    \node [block] (controller) {Controller};
    &
    \node [block, pin={[pinstyle]above:Disturbances}] (system) {System};
    &
    \coordinate (output);
\\
    &
    &
    \node [block] (sensor) {Sensor};
    &
    \node [block] (measurements) {Measurements};
    \\
    };
    \draw [->] (controller) -- node[mylabup] {$u$} (system);
    \draw [->] (measurements) -- node[mylabup] {$k$} (sensor);
    \draw [->] (input) -- node[mylabup] {$r$} (sum);
    \draw [->] (sum) -- node[mylabup] {$e$} (controller);
    \draw [->] (system) -- node [name=y,mylabup] {$y$} (output);
    \draw [->] (y) |- (measurements);
    \draw [->] (sensor) -| 
node [near end, left] {$y_m$} (sum);

\node[below left = -2pt and -1pt of sum] {$-$};
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada