Is there any way to know, when takeoff or navigating is done?

If the copter is controlled via MAVLINK, and taking off and navigation is made using MAV_CMD_TAKEOFF MAV_CMD_NAV_WAYPOINT messages, is there any way to know when these operations are complete?
Something like CMD_COMPLETE response message.

The code that I have seen monitors the altitude after MAV_CMD_TAKEOFF until the takeoff altitude is reached. I suspect you could do something with the position as well (e.g., “wait until we are within units of the target position”).

Yes, that’s the approach that I have been used.
By I just was wondering, if there is some proper way to get this information from the copter. Because the copter itself should know, that it completed taking off.

I think we don’t have any complete message when using Guided. This has been asked before and I think it can be added, but we need to think what message would be used for that - let’s say you send one command, the Copter reaches the end of it but at the same time you send another command; when you receive the complete message how do you know to which one it refers to?

Unfortunately I don’t understand the commands architecture completely, what for the copter is processing a command? It’s some kind of a mission, or a mode, or it’s just an internal flag?
I mean there can not be some COMPLETE message, but it can be some copter’s parameter (like attitude, mode etc) – which command is processing right now. And it should be empty, when the copter finishes the command.

The issue isn’t Copter knowing when it finished the received command, the issue is what message with what information it returns back.

Ideally, there would be a correlation ID associated with the command and response. That’s how most asynchronous messaging systems deal with this situation. The client sends a command with a unique ID like CMD_ID=1 and the server would respond eventually with an event containing that same CMD_ID. That disambiguates the responses for multiple outstanding requests.