In my mind, “Center stick is zero throttle” means that at center stick, the Herelink will output a PWM throttle value of 1000 us. The Herelink doesn’t transmit a throttle value to the motors, the onboard flight controller running Ardupilot deals with that. Herelink only sends PWM values for each axis (Aileron axis, Elevator axis, Rudder axis and Throttle axis). Those are the original names of each command sent out from an RC transmitter.
Ardupilot interprets these commands depending on the flight mode. For example, in Loiter, the Elevator/Aileron/Throttle commands are converted to forward/sideways/vertical velocity commands. When AP receives a throttle command of 1000, it interprets that as “descend as fast as possible”. When it receives 1500, AP interprets that as “hover”. The internal PID loops and motor mixer use these velocity commands to generate the throttle values to send to each motor. These throttle values are not the same thing as the throttle command that comes out of your RC transmitter.
If the Herelink outputs a throttle command of 1000 or 1100 at center stick, this is 100% the cause of your issue. At center stick, the throttle command sent out of the Herelink should be 1500.
In my mind, “Full down stick is zero throttle” means the Herelink will output 1000 when the throttle stick is full down, and 1500 when it is centered, which is what you want! I currently don’t have a Herelink lying around to check, my colleague has left with both of ours.
EDIT: If you want even more detail (but this will not help your issue):
One of the outputs of the PID loops is a value called “thrust”. This corresponds to the average throttle that will be sent out to your motors, and then the Mixer adds and subtracts values to that “thrust” value depending on the roll/pitch/yaw commands and errors. From your message, it seems you are worried that your throttle command from your RC transmitter will translate directly into “thrust”. In loiter, this is not the case. It would be the case for flight modes like Stabilize, but you’re not flying in Stabilize (your issue with your old 4:1 X-Class drone probably happened because you were in Stabilize mode). In loiter, for hover, AP uses the MOT_THST_HOVER parameter to approximate the thrust required for hover, but then the Integrator error (the “I” in PID) will adjust the “thrust” if the drone rises or descents when MOT_THST_HOVER is being used. This happens in the first few seconds of flight. So it’s always good practice to set MOT_THST_HOVER as close as possible to the “thrust” value. To find out what value to use for MOT_THST_HOVER, try to hover as best as you can, then look at the CTUN.ThO value in the logs. You can also enable MOT_HOVER_LEARN, and it will estimate what is the thrust value for hover. You can view the calculated value with CTUN.ThH.
But again, your issue is most likely that the RC transmitter is not outputting 1500 when you center your stick. When AP receives a throttle command of 1500, then it will use and adjust MOT_THST_HOVER to send to the mixer, which then creates the throttle command for each individual motor.