Skew compensation in the Bambu X1C Firmware

See this post for a method of compensating in Firmware for Skew in the X/Y geometry of the Bambu X1C:

See also this post in the Bambu Lab X1 Specific G-Code section.


Thanks! One of the most valuable posts in this whole forum!!!
It’s beyond me how bambu can’t be bothered to just publish this kind of information or - let’s dream - simply the whole fricking g/m-code documentation on their wiki.


WOW!! This is excellent. Great find.

I love that my X1C doesnt need constant calibration like any of my other printers but you can still run into the odd wee thing when you are printing precise stuff.


Thanks for posting. Is there anything similar to compensate for XZ and YZ skew? You can measure it using the CaliLantern or similar.

I think you just need to make sure, that your bed is perfectly level

Add this to the Bambu Lab X1 Specific G-Code thread.


Considering M1005 I0 is a thing, the macro resembles Marlins M852 (Bed Skew Compensation | Marlin Firmware).
It might be worth experimenting with M1005 In as an alternative for xy and M1005 Jn, M1005 Kn for xz and yz.


@JonRaymond Thanks for your suggestion.
I’ve done that here

@Nebur I thought the same and I’ve included the suggestion here

I think this is actually something Bambu should have included in the official Wiki.


Presumably, this procedure will need to be repeated if the firmware is updated or factory settings are restored?

@lkraus I think the skew compensation factor will be saved to EEPROM along with other printer settings and as in Marlin I would hope that re-flashing the firmware will not change the contents of EEPROM.

1 Like

Has anybody tried this yet?

M1005 [In]

M1005 can also be used with the [In] parameter to apply a skew correction factor (in radians)* for the XY axes. The correction factor can be calculated from 3 measurements of a test print as follows:

^     B-------C
|    /       /
|   /       /
|  A-------D
XY skew factor

Measure AC, BD and AD
Calculate AB and the skew factor:

AB = SQRT(2*AC^2+2*BD^2-4*AD^2)/2
skew_factor = TAN(PI/2-ACOS((AC^2-AB^2-AD^2)/(2*AB*AD))) radians

Apply the -ve of the skew factor as the correction factor with M1005:

M1005 I-skew_factor

Save the correction factor to EEPROM with M500

This is not iterative like M1005 [Xn] [Yn]. If you run M1005 [In] again the previous correction factor will be overwritten.

If you want to revert to the machine’s uncorrected skew use 0 as the correction factor for the [I] parameter:

M1005 I0

*(if you want to check what the angle in radians is in degrees, multiply by 180 and divide by pi)

Bambu Lab’s M1005 [In] behaves the same as Marlin’s M852 [In]. Unfortunately they don’t (yet) seem to have extended this to correct skew in the XZ and YZ planes (like Marlin’s M852 [Jn] and [Kn] parameters do). At least I haven’t had any success trying M1005 [Jn] or [Kn] on firmware version

The M1005 gcode looks like a wrapper round (some of) the function of Marlin’s M852 with the addition of the [Xn] and [Yn] parameters as a convenient way for the user to enter just 2 measurements from a test print without having to calculate the skew factor. In the instructions pdf (link) from Bambu tech support they say they intend to improve the skew compensation method in the future. I hope they include XZ and YZ compensation.

It’s frustrating to have such a good printer but with closed source firmware. It’s the only thing I don’t like about the Bambu X1C.


@Nebur, I’ve now confirmed that M1005 [In] has the same function as Marlin’s M852 [In]

See my recent post in this thread for details.

1 Like

@SimEyeSee Yes, I significantly reduced the skew in my XY axes with it.

1 Like

@NeverDie Unfortunately they don’t seem to have implemented XZ and YZ skew compensation yet. See my recent post in this thread, titled M1005 [In], for details.

1 Like

I will have to try it one day.

I did try this, no joy at all. ran 4 times and 4 measurements all the same values. printer is X1C and latest firmware.

It really works after I use it.
Solved the skew problem
But when I turn the power off and on again, it returns to the previous situation.
I did add the M500 command