Skip to content

Beltless CVT Simulation

February 20 2025

My brother, Lucas, was in town and he told me about a recent video covering a beltless CVT transmission. As a student who created a CVT for his senior design project, he was very excited to share the video with me.

Inspiration

https://www.youtube.com/watch?v=mWJHI7UHuys

Setup

What we are solving for is essentially a classical four bar linkage which has been demonstrated by radcli14 before but ours has a little twist to it. What makes this special is the second bar (BB) is not a fixed length but instead a dependant variable of the input angle. Also, the angle of the third bar (θ3\theta_3) is a function of the angle of bar BB.

I am using Sympy to perform the calculations and Manim for the animation

The red line is our “chain”. Bar AA is not rotating at a constant velocity. This is because it the “input” is to be attached to an elliptical gear which meshed with another gear about point AA causing θ1\theta_1 to change in speed depending on the angle of the lobe at the given point in time. The reason why we used an elliptical gear will be discussed later on.

There are two guides that helped me with the rest of the setup:

Analysis

Elliptical Gear

We will use θi\theta_i and ωi\omega_i as the input angle and velocity for the first lobed gear and have θ1\theta_1 and ω1\omega_1 represent the second lobed gear as a function of the input one.

riθ˙i=r1θ˙1\displaystyle r_{i} \dot{\theta}_{i} = r_{1} \dot{\theta}_{1}

re-arranging for θ˙1\dot{\theta}_{1}

θ˙1=e2cos2(θ1)+1θ˙ie2cos2(θi)+1\dot{\theta}_{1}\, = \,\frac{\sqrt{- e^{2} \cos^{2}{\left(\theta_{1} \right)} + 1} \dot{\theta}_{i}}{\sqrt{- e^{2} \cos^{2}{\left(\theta_{i} \right)} + 1}}

solving this with an ODE solver results in the expected non-constant rotation between the two gears

Kinematics

Rotation matrix for each frame

RA=[cos(θ1)sin(θ1)0sin(θ1)cos(θ1)0001]\mathbf{R}_A \, = \,\left[\begin{matrix}\cos{\left(\theta_{1} \right)} & \sin{\left(\theta_{1} \right)} & 0\\- \sin{\left(\theta_{1} \right)} & \cos{\left(\theta_{1} \right)} & 0\\0 & 0 & 1\end{matrix}\right]

RB=[cos(θ2)sin(θ2)0sin(θ2)cos(θ2)0001]\mathbf{R}_B \, = \,\left[\begin{matrix}\cos{\left(\theta_{2} \right)} & \sin{\left(\theta_{2} \right)} & 0\\- \sin{\left(\theta_{2} \right)} & \cos{\left(\theta_{2} \right)} & 0\\0 & 0 & 1\end{matrix}\right]

RC=[sin(θ2)cos(θ2)0cos(θ2)sin(θ2)0001]\mathbf{R}_C \, = \,\left[\begin{matrix}\sin{\left(\theta_{2} \right)} & - \cos{\left(\theta_{2} \right)} & 0\\\cos{\left(\theta_{2} \right)} & \sin{\left(\theta_{2} \right)} & 0\\0 & 0 & 1\end{matrix}\right]

Angular rate for each frame

ωA=ω1n^z\mathbf{\omega}_A \, = \, \omega_{1}\mathbf{\hat{n}_z}

ωB=ω2n^z\mathbf{\omega}_B \, = \, \omega_{2}\mathbf{\hat{n}_z}

ωC=ω2n^z\mathbf{\omega}_C \, = \, \omega_{2}\mathbf{\hat{n}_z}

while we are at it, create the roation matrix and angular for the output frame. This is entirely dependant on the kinematic system.

ROF=[sin(θ2+lblc)cos(θ2+lblc)0cos(θ2+lblc)sin(θ2+lblc)0001]\mathbf{R}_{OF} \, = \,\left[\begin{matrix}- \sin{\left(\theta_{2} + \frac{l_{b}}{l_{c}} \right)} & \cos{\left(\theta_{2} + \frac{l_{b}}{l_{c}} \right)} & 0\\- \cos{\left(\theta_{2} + \frac{l_{b}}{l_{c}} \right)} & - \sin{\left(\theta_{2} + \frac{l_{b}}{l_{c}} \right)} & 0\\0 & 0 & 1\end{matrix}\right]

ωOF=(ω2+lb˙lc)n^z\mathbf{\omega}_{OF} \, = \, (\omega_{2} + \frac{\dot{l_b}}{l_{c}})\mathbf{\hat{n}_z}

Constraints

Positions constraint equation

lcc^x+lbb^x+laa^xlnn^x=0l_{c}\mathbf{\hat{c}_x} + l_{b}\mathbf{\hat{b}_x} + l_{a}\mathbf{\hat{a}_x} - l_{n}\mathbf{\hat{n}_x} \, = \, 0

Positions constraint with respect to inertial frame

[lacos(θ1)+lcsin(θ2)ln+lbcos(θ2)lasin(θ1)lccos(θ2)+lbsin(θ2)]\left[\begin{matrix}l_{a} \cos{\left(\theta_{1} \right)} + l_{c} \sin{\left(\theta_{2} \right)} - l_{n} + l_{b} \cos{\left(\theta_{2} \right)}\\l_{a} \sin{\left(\theta_{1} \right)} - l_{c} \cos{\left(\theta_{2} \right)} + l_{b} \sin{\left(\theta_{2} \right)}\end{matrix}\right]

Velocity constraint

lcω2c^y+l˙bb^x+lbω2b^y+laω1a^y=0l_{c} \omega_{2}\mathbf{\hat{c}_y} + \dot{l}_{b}\mathbf{\hat{b}_x} + l_{b} \omega_{2}\mathbf{\hat{b}_y} + l_{a} \omega_{1}\mathbf{\hat{a}_y} \, = \, 0

Velocity constraint with respect to inertial frame

[laω1sin(θ1)+lcω2cos(θ2)+lb˙cos(θ2)lbω2sin(θ2)laω1cos(θ1)+lcω2sin(θ2)+lb˙sin(θ2)+lbω2cos(θ2)]\left[\begin{matrix}- l_{a} \omega_{1} \sin{\left(\theta_{1} \right)} + l_{c} \omega_{2} \cos{\left(\theta_{2} \right)} + \dot{l_b} \cos{\left(\theta_{2} \right)} - l_{b} \omega_{2} \sin{\left(\theta_{2} \right)}\\l_{a} \omega_{1} \cos{\left(\theta_{1} \right)} + l_{c} \omega_{2} \sin{\left(\theta_{2} \right)} + \dot{l_b} \sin{\left(\theta_{2} \right)} + l_{b} \omega_{2} \cos{\left(\theta_{2} \right)}\end{matrix}\right]

Our velocity constraint is not very useful at the moment since it is composed of some dependant variables we do not know the values for. The variables it is composed of are

{lb˙,lb,ω1,ω2,θ1,θ2}\displaystyle \left\{\dot{l_b}, l_{b}, \omega_{1}, \omega_{2}, \theta_{1}, \theta_{2}\right\}

We can see that the expressions are linear in ω1\omega_1, ω2\omega_2 and l˙b\dot{l}_b. If we select ω2\omega_{2} and lb˙\dot{l_b} to be dependent, we can solve the linear system Ax¯=b¯\mathbf{A}\bar{x}=\bar{b} for those variables using the technique shown in Solving Linear Systems. First we define a column vector holding the dependent variables:

Our velocity constraint is

f=[laω1sin(θ1)+lcω2cos(θ2)+lb˙cos(θ2)lbω2sin(θ2)laω1cos(θ1)+lcω2sin(θ2)+lb˙sin(θ2)+lbω2cos(θ2)]f = \displaystyle \left[\begin{matrix}- l_{a} \omega_{1} \sin{\left(\theta_{1} \right)} + l_{c} \omega_{2} \cos{\left(\theta_{2} \right)} + \dot{l_b} \cos{\left(\theta_{2} \right)} - l_{b} \omega_{2} \sin{\left(\theta_{2} \right)}\\l_{a} \omega_{1} \cos{\left(\theta_{1} \right)} + l_{c} \omega_{2} \sin{\left(\theta_{2} \right)} + \dot{l_b} \sin{\left(\theta_{2} \right)} + l_{b} \omega_{2} \cos{\left(\theta_{2} \right)}\end{matrix}\right]

Taking the jacobian of it with respect to ω2\omega_{2} and lb˙\dot{l_b}

A=Jf(ω2,lb˙)=[lccos(θ2)lbsin(θ2)cos(θ2)lcsin(θ2)+lbcos(θ2)sin(θ2)]\mathbf{A} = \mathbf{J}_f(\omega_{2}, \dot{l_b}) = \displaystyle \left[\begin{matrix}l_{c} \cos{\left(\theta_{2} \right)} - l_{b} \sin{\left(\theta_{2} \right)} & \cos{\left(\theta_{2} \right)}\\l_{c} \sin{\left(\theta_{2} \right)} + l_{b} \cos{\left(\theta_{2} \right)} & \sin{\left(\theta_{2} \right)}\end{matrix}\right]

Then find the terms not linear in the dependent variables:

b¯=[laω1sin(θ1)laω1cos(θ1)]\bar{b} = \displaystyle \left[\begin{matrix}l_{a} \omega_{1} \sin{\left(\theta_{1} \right)}\\- l_{a} \omega_{1} \cos{\left(\theta_{1} \right)}\end{matrix}\right]

results in

x¯=[laω1cos(θ1θ2)lbla(lccos(θ1θ2)+lbsin(θ1θ2))ω1lb]\bar{x} = \displaystyle \left[\begin{matrix}\frac{l_{a} \omega_{1} \cos{\left(\theta_{1} - \theta_{2} \right)}}{l_{b}}\\- \frac{l_{a} \left(l_{c} \cos{\left(\theta_{1} - \theta_{2} \right)} + l_{b} \sin{\left(\theta_{1} - \theta_{2} \right)}\right) \omega_{1}}{l_{b}}\end{matrix}\right]

Sweet, now we can write any velocity strictly in terms of the independent speed θ1\theta_1 and all of the other position coordinates

Results

Lets plot the linkages to see what they look like. I am solving the system for every 1/30th of a revolution.

linkages.png

Lets verify the length of our chain is calculated correctly by plotting lBl_B, the length of the arc between P3P3 and OFOF (the green line and the orange line from the previous plot)

chain.png

Of course we won’t use just of these systems or else we would have output torque that varies wildly resulting in a bumpy ride. What we can do is chain multiple systems together with an offset so thy take turns providing torque.

input_vs_output_angle.png

input_angle_vs_output_speed.png

The linage with the maximum angular acceleration will be the one contributing to the whole, so we can just plot the max of the 4 systems

input_angle_vs_max_output_speed.png

This line os not perfectly flat as desired, but it is much better without the elliptical input gears.

Optimization

There are different things to optimize. The first optimization is to use an elliptical gear set (yes, strange, but it seems to help) on the input drive. This was my brother, Lucas’s, idea.

I didn’t even go into optimizing the different length and positions of the linkages. Ideally, it would be optimized across the full range of the adjustable linkage (lAl_A in our case).

Conclusion

If it wasn’t for Jason K. Moore’s excellent online book over Learn Multibody Dynamics, I don’t think I would have been able to get as fas as I did.

All of the source code can be found here. I used python for the math and took a symbolic approach the the solution. Lucas did the same thing in Matlab and took a vectorized approach.

This page is delivered to you from my garage.