Como corrigir este bloco de diagrama?

Como corrigir este bloco de diagrama?

insira a descrição da imagem aqui

\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}

Responder1

Substituir left of=measurementspor below=of controller.

Três notas menores:

  • As chaves left of, right ofetc estão obsoletas. Agora é recomendado usar left=of ...em vez de left of=...etc. Isso requer \usetikzlibrary{positioning}. Esta mudança é mais do que uma transposição de letras. O novo posicionamento é mais robusto e flexível do que o antigo.

  • Você pode escrever block/.style = {...}(como uma opção tikzpictureou como argumento para \tikzset) em vez de \tikzstyle{block} = [...]. Pelo que entendi, o primeiro método (que também usei abaixo) está mais alinhado com as convenções atuais do tikz. O segundo método é uma sintaxe bastante singular, não usada em nenhum outro lugar do tikz.

  • Como Zarko observou nos comentários, a distância do nó pode ser escolhida de forma diferente na direção xey, especificando, por exemplo node distance=1cm and 2cm.

insira a descrição da imagem aqui

\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}

Responder2

Como complemento aoGernot(nem tanto) resposta "detalhada", espero que seja mais concisa :) Nela eu uso calcuma 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}

insira a descrição da imagem aqui

Editar:Mudança considerandoCarLaTeXcomentar, os comentários no código agora são mais significativos. Ainda acredito que minha ordem sugerida de blocos "sensor" e "medição" está correta. Porém até que esses blocos sejam lineares, a ordem não é essencial :)

Responder3

Acho que você também poderia usar um TikZ matrix.

Observe que arrowsa biblioteca está obsoleta. Do Manual TikZ e PGF, para. 16.1:

Observação: As bibliotecas arrows e arrows.spaced estão obsoletas. Use arrows.meta em vez disso/adicionalmente, o que permite fazer tudo o que as bibliotecas antigas ofereciam e muito mais. No entanto, as bibliotecas antigas ainda funcionam e você pode até misturar pontas de setas antigas e novas (apenas as pontas de setas antigas não podem ser configuradas da maneira descrita no restante desta seção; dizer que escala=2 para uma seta de látex não tem efeito para por exemplo, enquanto para setas de látex seu tamanho dobra como seria de esperar.)

Além disso, como gernot já disse, \tikzsetdeveria ser usado em vez de \tikzstyle(veraqui).

\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}

insira a descrição da imagem aqui

informação relacionada