It boils down to the physics of your system. PID loops need to see error to generate an output. This, by its very definition, means that you will start following a trajectory by not following it and waiting until enough error accumulates to get started. FF lets you take the known physics of your system into account.
Your basic motor model says that a current into your motor results in a torque proportional to the current. So, input -> acceleration. If we want to be able to actually track a trajectory, we need a trajectory which has bounded acceleration. Instantaneously changing velocity would not have bounded acceleration, so it would not be able to be followed by a motor without some error.
For Kv and Ka, you can tune them empirically or with the physics. https://www.youtube.com/watch?v=RLrZzSpHP4E walks you through how to model an elevator.
As for implementing a motion profile, you will need to update the output very frequently to get precise results. We run everything at 200 hz on 971. If you are using CAN, I’d recommend using the built in profiling on the talon during the season, and to try implementing everything yourself during the offseason to learn more.