For many years, our formula electric team has bestowed one new suspension team member the task of optimizing the geometry of the bellcranks. While the project initially sounds fun, it is actually an incredibly tedious, time-consuming and monotonous task. I can say this because I was tasked with this project during my first year on the team. Now the reason why this takes forever is because the strategy that has been passed on year after year is to simply brute force as many geometry combinations as possible, run through a 14 position sweep on the parametric models in SolidWorks, and note down each value one by one. Surely we would have found a faster way to do it by now! You're wrong. I spent ten hours and pulled an all-nighter just to run through eleven geometries. I knew after that I had to find some way to automate this process. I thought it would be a fun challenge and would teach me some new SolidWorks skills, and hopefully save some of the future suspension members some precious time. I mean just look at this:
Automation Solution
Remember when I said it took me ten hours to run through eleven geometries? This script I wrote can now run through 920 geometries per bellcrank in only five hours. It also found a better geometry than I did.
Baseline Test
This test is done on the current bellcrank geometry, and it’s mainly to check that the macro is working and rebuilding properly. It runs the single geometry once through the entire 14 suspension positions in 5mm increments from 30 to 95mm of wheel travel (in CAD).
↓
Stage 1: Global Halton Screening
In the first stage, 480 different geometries are tested. For each geometry, the macro runs through 7 suspension positions (30, 40, 50, 60, 70, 80, 95) to get a broad idea of its motion ratio. It looks through the entire search space, using Halton sampling to select a wide range of geometries to test. I wrote down how these 480 geometries are chosen below.
↓
Stage 2: Regional Screening
In this stage, the script will rank geometries from stage 1 that were successful. It uses the following motion ratio error term to determine the best geometries.
It also separately considers the size of the bellcrank, which we also want to minimize to reduce cost. I included how this is calculated below. I decided to consider the motion ratio score and size score independently because I didn’t want the algorithm to prefer a smaller bellcrank with a bad motion ratio. I made it so that we only consider the size for the bellcranks that have optimal motion ratio scores.
Based on these scores, stage 2 chooses the top 12 geometries. Since I still wanted to cover a broad range with this stage, I calculated the normalized distance between each pair of geometries just to make sure that they are far enough apart from each other (d ≥ 0.1) and we’re not concentrating our efforts on a single area of the graph just because the best 12 from stage 1 happen to be in the same place. This is how I did the normalization:
At each anchor, the search looks through a small area around it. Here’s an example of what I mean:
Overall, stage 2 went through 320 total geometries and each one was checked at all 14 suspension positions (30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95).
↓
Stage 3: Fine Refinement
This is pretty much the same as step 2, except it chooses 8 anchors from stage 2 with a much smaller normalized distance requirement (d ≥ 0.04). It looks at a total of 120 geometries and goes through the full 14 position sweep with each one. The search space around each anchor is smaller in stage 3:
Below is a 14-second video rendition of the entire five hour process I described above. I made this on MATLAB using actual data from the solidworks optimization. The main takeaway is that the algorithm covers a wide range of geometries before narrowing the search toward the best one.
Below I have included INTERACTIVE 3D plots of the search process. I would highly encourage you to INTERACT with it; I spent a long time trying to make it work. You can click the different stages in the legend to filter the data points, which can provide a better idea of how my code went through the design space and converged on a final optimized geometry. You can also click individual points to see their geometries and motion ratios.
Click a stage to show / hide it
Click any point to inspect its geometry
L₁
L₂
α
β
Average MR
Click a stage to show / hide it
Click any point to inspect its geometry
L₁
L₂
α
β
Average MR
For every geometry candidate, the macro wrote these values into the driver model, then rebuilt the assembly and moved the suspension through either 7 or 14 wheel-travel positions, then recorded the motion ratio data. If the geometry is unable to rebuild or has invalid kinematics (e.g. it violates a mate, etc.) then it would automatically reject it. The same optimization process happens for both the front and rear suspension models. The only thing that is different between front and rear are the ranges of geometries tested, which is determined by the available space we have in our car and past geometries. Here’s my code for the front optimization, just remember to make changes that suit your vehicle’s geometry and target motion ratio if you’re planning on using it.
These videos show the macro in action. It selects the geometry, applies it to the driver file, then rebuilds the dynamic suspension parametric model and runs through the different positions. Seeing this automatically do the same work I had previously spent ages doing by hand nearly brought tears to my eyes.
In total, 1840 geometries were tested (920 for the front and 920 for the rear). Each successful geometry was mainly ranked based on how closely their motion ratio curves followed the target value throughout the entire wheel travel. I considered both RMS error and the total motion ratio range to prevent a curve from getting a good ranking if it had a good average but big fluctuations. We needed the MR curve to be almost linear. The size of the bellcrank was also considered but only for geometries that had good MR behavior, and I used L1 + L2 as the measurement for overall size. Below are the top ten geometries found using my algorithm for the front and rear:
Front Top Candidates
Rank
L1 (mm)
L2 (mm)
Alpha (deg)
Beta (deg)
Optimization Score
Mean MR
MR Range
RMS Error
1
58
67
106
79
0.003601
0.831186
0.013203
0.003287
2
64
74
99
84
0.004203
0.828790
0.015633
0.005508
3
62.5
72.5
100
82.5
0.005943
0.831577
0.019528
0.006808
4
59
67
112
74
0.006561
0.829400
0.022235
0.005819
5
56
65
106
76
0.006842
0.831133
0.024435
0.009382
6
59
67
112
75
0.008332
0.831025
0.034014
0.008761
7
65
75
96
85
0.008792
0.826872
0.028245
0.009786
8
56
65
110
72
0.009938
0.834180
0.028210
0.010990
9
56
64
108
78
0.010039
0.823868
0.026771
0.008683
10
55
63
108
75
0.010155
0.822122
0.016177
0.009918
Rear Top Candidates
Rank
L1 (mm)
L2 (mm)
Alpha (deg)
Beta (deg)
Optimization Score
Mean MR
MR Range
RMS Error
1
60
65
110
80
0.009873
0.849931
0.040000
0.010082
2
53
58
111
73
0.010734
0.843877
0.035012
0.013765
3
64
71
95
88
0.011401
0.848872
0.036529
0.012302
4
62
67
108
83
0.013315
0.844416
0.051707
0.013864
5
58
64
106
77
0.014721
0.852212
0.047305
0.017935
6
65
72
101
88
0.015916
0.850612
0.047442
0.014226
7
63
70
92
88
0.016816
0.850945
0.054414
0.017780
8
63
71
98
89
0.018551
0.856718
0.051106
0.017078
9
47.5
52.5
112.5
77.5
0.018667
0.848064
0.088380
0.021745
10
57
60
114
76
0.019601
0.832202
0.045444
0.018282
When I plotted the motion ratio curve for the highest ranking geometries in the front and rear, you can see that they are both pretty linear. The rear one does deviate slightly near the wheel travel limits, but its overall error is low and the damper is not expected to reach full compression or extension, which makes these extreme positions less significant when evaluating performance. I would consider these curves to demonstrate very good behavior.
The optimization script measured kinematic performance, but I still needed to verify that the physical bellcrank would be able to go through the entire 57mm of wheel travel without hitting a rod end or the damper. I applied the top geometries to our kinematic model and set it at both limits of wheel travel, making sure there was clearance on each side. I’m including this step because while scripts can automate a lot of the design process, forgetting to check whether something can physically work will be a pain later on if you just start manufacturing based on the geometry given to you by the script.
Force Calculations
After finalizing the geometry, I calculated the forces needed to do a structural analysis. The next four images show you the dimensions I took from both the max compression case and the transformed case. The first two images show the front and rear assemblies at max compression, where I used the lever arm lengths and force angles at this position to calculate the pushrod force using a moment equilibrium around the bellcrank pivot.
The next two images show the bellcranks rotated back to ride height. Since the force calculations were done when the suspension was at max compression, I had to use a rotation matrix to transform the force vectors back into the coordinate systems that would be used by ANSYS.
ANSYS FEA and Topology Optimization
I first analyzed fully solid bellcranks to see how the stress distribution looks and identify the primary load paths between the pushrod, shock, central bearing and ARB connections. From this, I found that the central regions of the plate were receiving relatively little stress. After confirming this through topology optimization, I removed the excess material and conducted another structural analysis on the revised designs. For the front bellcrank, the ARB case had a maximum stress of 271.47 MPa and a safety factor (SF) of 1.70. The no-ARB case reached 231.94 MPa and had a SF of 1.99. For the rear, the no-ARB case reached 238.78 MPa with a SF of 1.93, while the ARB case reached 235.98 MPa with a SF of 1.96. All cases had a safety factor at or above 1.70, which showed that removing the material could reduce the plate’s mass while keeping its strength.
Bellcrank
Case
Max von Mises Stress
Safety Factor
Front
No ARB
231.94 MPa
1.99
Front
ARB
271.47 MPa
1.70
Rear
No ARB
238.78 MPa
1.93
Rear
ARB
235.98 MPa
1.96
Final Design
Bellcrank engineering drawings
Manufacturing
The final bellcrank was manufactured from 3.18mm thick 7075-T6 aluminum using a waterjet cutter.