While Hendrik Jan's answer is totally spot-on, it's worth noting that you don't always need to follow the algorithmic construction to get a PDA. If you can decide via analysis what the language is, you can often come up with a machine more easily.
The grammar you give generates $a^nb^{2n} \cup a^{2n}b^n$ where $n > 0$. In particular, any construction which uses the rule $S \rightarrow aAbb$ will generate a string in $a^nb^{2n}$, and any construction using the rule $S \rightarrow aaBb$ will generate a string in $a^{2n}b^n$.
Therefore, a simple procedure to obtain a correct PDA is the following:
- Create a PDA $M_1$ to recognize $a^nb^{2n}$ for $n > 0$.
- Create a PDA $M_2$ to recognize $a^{2n}b^n$ for $n > 0$.
- Create a PDA $M$ which recognizes $L(M_1) \cup L(M_2)$.
Each of these steps is significantly easier than trying to create a PDA from the original grammar, in my opinion, anyway.
For (1), push two $a$'s onto the stack for each $a$ you read, then pop an $a$ each time you read a $b$. Accept if the stack is empty once the input is gone.
For (2), push an $a$ for every two $a$'s you read, then pop an $a$ for each $b$ you read. Accept if the stack is empty once the input is gone.
For (3), you can create a new initial state and non-deterministically jump to the initial state of either $M_1$ or $M_2$ without consuming any input or putting anything on the stack. This will ensure that if your input represents a string accepted by either of the automata, then there will be a path that accepts the input.