Hi again,
It looks like your program is first lifting the finite mass object free of contact with the infinite mass object (SolvePenetration), and then applies a separation impulse of some magnitude (SolveImpulse). So in short, your code lifts the movable object free of the ground and then applies a velocity away from it. This will always create jitter.
I would drop SolvePenetration completely and only apply an iterative impulse that separates the objects and dampens them, in principle like a damped spring but formulated as an impulse. Something like this, where k and d are stiffnes and damping coefficients between 0 and 1 (start with 0.3 or something like that). Number of iterations could be anything from 1 to 20, you should see a noticeable difference. You may need to swap signs somewhere to make it work properly, remember I can't test this, only compare to my own code.
Cheers,
Mike
void Contact::solveImpulse(){
Vec2 rel_vel=b2->vel-b1->vel;
float sep_vel=rel_vel.dot(ci.normal);
float tot_i_mass=b1->i_mass+b2->i_mass;
b1->vel+=ci.normal*(-ci.pen*(1.0f/(float)FPS)*k+sep_vel*d)*((b1->i_mass/(tot_i_mass));
b2->vel-=ci.normal*(-ci.pen*(1.0f/(float)FPS)*k+sep_vel*d)*((b2->i_mass/(tot_i_mass));
}