Radu, Got it, thanks! Yes, it would definitely be easier to find with the wrapper, but this works too. I guess, once one knows where to look, modelling and simulation setup gets faster. :)
On Thursday 25 January 2024 at 03:47:37 UTC-5 Radu Serban wrote: > Prakhar, > > > > You can use the functions ChFrameMoving:: GetWvel_loc() and > ChFrameMoving::GetWvel_par() to get the angular velocity of a body, > expressed in the local and absolute reference frames, respectively. > > > > For a ChBody in Chrono (centroidal reference frame), you can call those > methods directly on the body object (since ChBody is a ChFrameMoving). > > > > However, when for a vehicle’s chassis body (which is modeled as a > ChBodyAuxRef; i.e. a body with a non-centroidal reference frame), you will > want to use something like: > > auto w = vehicle. GetRefFrame().GetWvel_loc(); > > to get the angular velocity of the chassis reference frame expressed in > the chassis reference frame. Then get the component along the Z axis of > that chassis reference frame to get the yaw rate. > > > > I should maybe provide wrapper functions to get this type of information > for a ChVehicle. > > > > --Radu > > > > *From:* [email protected] <[email protected]> *On > Behalf Of *Prakhar Gupta > *Sent:* Wednesday, January 24, 2024 10:49 PM > *To:* ProjectChrono <[email protected]> > *Subject:* Re: [chrono] Re: How to get the current steering? > > > > Hello, > > Posting a question on a related topic here - about retrieving vehicle > states. > > > > I have been able to extract speed, positions, rotations etc. from chrono > using some of the GetX() functions as below: > > > > auto marker_com = > hmmwv.GetChassis()->GetMarkers()[1]->GetAbsCoord().pos; > double current_spd = hmmwv.GetVehicle().GetSpeed(); > //ChQuaternion current_quat = hmmwv.GetVehicle().GetRot(); > //ChVector current_rot = current_quat.Q_to_Euler123(); > double current_yaw = > hmmwv.GetVehicle().GetRot().Q_to_Euler123().z(); //radians > > > > I have not yet come across an existing function that retrieves the current > Yaw Rate (rad/sec) of the vehicle directly. Is there such a function > already that I can utilize? Or is there an attribute that I can access for > this? > > > > Thanks! > > > > Prakhar Gupta > > PhD Student > > Clemson University > > On Monday 13 November 2023 at 14:31:52 UTC-5 [email protected] wrote: > > Hello Urara, > > > > Sorry for missing that the code was still not behaving as expected. > > > > Could you try this piece of code > > > > > > wheel = self.my_hmmwv.GetVehicle().GetWheel(0, 0).GetSpindle() > > wheel_normal_abs = wheel.GetA().Get_A_Yaxis() > > wheel_normal_loc = self.my_hmmwv.GetChassisBody( > > ).TransformDirectionParentToLocal(wheel_normal_abs) > > wheel_angle = np.arctan2( > > wheel_normal_loc.y, wheel_normal_loc.x) - np.pi/2 > > toe_in = wheel_angle > > > It seems to be giving the right plot for the left front tire. Its the same > idea as before, except now we compute the angle with respect to the chassis > body's heading. Attached is the plot I get. Also its better if we don't > refer this angle as the "toe" angle because the "toe" angle is usually > defined at 0 steer and is a static parameter. > > > > Let me know if this looks okay > > On Thursday, November 9, 2023 at 2:32:45 PM UTC-6 [email protected] > wrote: > > Dear Huzaifa, > > > > Thank you for checking my codes! > > > > I corrected my codes, but now all my four wheels stay 0. In the plot you > sent me, it also seems that all four wheels are 0 and only the driver input > is 30 degrees. > > My code currently sets all wheel drive in init_vehicle() in > chrono_env/utils.py. So shouldn't all four wheels be 0 at the beginning and > go up to 30 degrees? > > > > I attached the plot that only plots the front left wheel and driver's > input. '1st_code.png' and '2nd_code.png' correspond to the two patterns of > your suggested codes. > > > > I additionally tried two other methods in step() in chrono_env.py. > However, none of these gave the results that I expected. > > I calculated the Euler angle of the wheel with respect to the vehicle > (chassis) frame. > > They should give roll and pitch being always 0 and yaw being 30 degrees. > > I pushed this code and the figures to the same repo again. > https://github.com/UraraKono/pychrono-steering > > > > Would you mind taking a look at my code again? > > > > Best regards, > > Urara > > > > On Thu, Nov 9, 2023 at 9:59 AM 'HUZAIFA MUSTAFA UNJHAWALA' via > ProjectChrono <[email protected]> wrote: > > Hello Urara, > > > > I made a mistake in my code above. Changing your toe-in function from > > > > def get_toe_in(self, wheel_state_global): > # Wheel normal expressed in global frame > wheel_normal = wheel_state_global.rot.GetYaxis() > # Terrain normal at wheel location expressed in global frame > Z_dir = self.terrain.GetNormal(wheel_state_global.pos) > # Longitudinal (heading) and lateral directions, in the terrain plane > wheel_normal_np = np.array([wheel_normal.x, wheel_normal.y, > wheel_normal.z]) > > #Vcross cannot be found in pychrono. So I'm converting ChVectorD to > numpy array and using np.cross > Z_dir_np = np.array([Z_dir.x, Z_dir.y, Z_dir.z]) > X_dir_np = np.cross(wheel_normal_np, Z_dir_np) > X_dir = chrono.ChVectorD(X_dir_np[0], X_dir_np[1], X_dir_np[2]) > X_dir.Normalize() > X_dir_np = np.array([X_dir.x, X_dir.y, X_dir.z]) > Y_dir_np = np.cross(Z_dir_np, X_dir_np) > Y_dir = chrono.ChVectorD(Y_dir_np[0], Y_dir_np[1], Y_dir_np[2]) > rot = chrono.ChMatrix33D() > rot.Set_A_axis(X_dir, Y_dir, Z_dir) > tire_csys = chrono.ChCoordsysD(wheel_state_global.pos, > rot.Get_A_quaternion()) > > # Express wheel normal in tire frame > n = tire_csys.TransformDirectionParentToLocal(wheel_normal) > # print("n",n.x, n.y, n.z) > > # Wheel normal in the vehicle frame > n_v = > self.my_hmmwv.GetVehicle().GetTransform().TransformDirectionLocalToParent(wheel_normal) > > # Toe-in > toe_in = math.atan2(n_v.x, n_v.y) > > return toe_in > > To > > > > def get_toe_in(self, wheel_state_global): > > # Wheel normal expressed in global frame > > wheel_normal = wheel_state_global.rot.GetYaxis() > > # Terrain normal at wheel location expressed in global frame > > Z_dir = self.terrain.GetNormal(wheel_state_global.pos) > > # Longitudinal (heading) and lateral directions, in the terrain plane > > wheel_normal_np = np.array([wheel_normal.x, wheel_normal.y, > wheel_normal.z]) > > > > #Vcross cannot be found in pychrono. So I'm converting ChVectorD to numpy > array and using np.cross > > Z_dir_np = np.array([Z_dir.x, Z_dir.y, Z_dir.z]) > > X_dir_np = np.cross(wheel_normal_np, Z_dir_np) > > X_dir = chrono.ChVectorD(X_dir_np[0], X_dir_np[1], X_dir_np[2]) > > X_dir.Normalize() > > X_dir_np = np.array([X_dir.x, X_dir.y, X_dir.z]) > > Y_dir_np = np.cross(Z_dir_np, X_dir_np) > > Y_dir = chrono.ChVectorD(Y_dir_np[0], Y_dir_np[1], Y_dir_np[2]) > > rot = chrono.ChMatrix33D() > > rot.Set_A_axis(X_dir, Y_dir, Z_dir) > > tire_csys = chrono.ChCoordsysD(wheel_state_global.pos, > rot.Get_A_quaternion()) > > > > # Express wheel normal in tire frame > > n = tire_csys.TransformDirectionParentToLocal(wheel_normal) > > # print("n",n.x, n.y, n.z) > > > > # Toe-in > > toe_in = math.atan2(n.x, n.y) > > > > return toe_in > > > > The mistake is that the code unnecessarily converted the wheel normal back > to the vehicle frame and used that for the toe-in computation. So as you > rightly pointed out, the angles were in vehicle frame. > > > > That being said, I realized that the approach I proposed is too > convoluted, the following code also works > > # Get wheel state > > wheel_state_global = self.my_hmmwv.GetVehicle().GetWheel(0,0).GetState() #in > global frame > > # Express wheel normal in tire frame > > wheel_normal = wheel_state_global.rot.GetYaxis() > > n = self.my_hmmwv.GetVehicle().GetWheel(0,0 > ).GetTransform().TransformDirectionParentToLocal(wheel_normal) > > # toe_in = get_toe_in(self, wheel_state_global) > > toe_in = math.atan2(n.x, n.y) > > > > This directly gets the tire frame using GetTransform(). > These modified functions produce the following plot, which I think is what > we expect > > > > Best Huzaifa > > > > On Wednesday, November 8, 2023 at 11:02:54 AM UTC-6 [email protected] > wrote: > > Dear Huzaifa, > > > > Thank you so much! This is the link to my code: > https://github.com/UraraKono/pychrono-steering > <https://urldefense.com/v3/__https:/github.com/UraraKono/pychrono-steering__;!!IBzWLUs!VjMQTjj7XYOajqdEp2lng6LR8VoirumLVvQh9bxVJkIHsL9lfVWBopcU5pDozX8ZAUT0sVo0oEycxoQ5TyAhcEl1btSDG3s$> > Could you first look at the README file to get the overview of my code? > Please run main.py. > > > > Best regards, > > Urara > > > > On Mon, Nov 6, 2023 at 1:02 PM 'HUZAIFA MUSTAFA UNJHAWALA' via > ProjectChrono <[email protected]> wrote: > > Hello Urara, > > > > The code I provided for toe_in_r is what I suppose is the \delta from your > image. However note that the vehicles in PyChrono are 4 wheeled, so you > might need to make an approximation to get the \delta from the image (maybe > take the average). > > That being said, from your plot, it is surprising that the rear tires have > a toe angle and the angle keeps decreasing. Can you please post here the > snippet of code that generated the data for the plots? I can try taking a > quick look and reproduce this on my end. > > > > Best > > Huzaifa > > > > On Friday, November 3, 2023 at 11:03:56 AM UTC-5 [email protected] > wrote: > > Hello, > > > > Thank you so much for the reply! > > By "steering velocity and acceleration", I meant the steering angular > velocity of the tires and the longitudinal acceleration of the vehicle body. > > > > I tried your code in Pychrono. > > However, even though I set the driver's steering input to be always "1" so > that the vehicle keeps turning anti-clock-wise, the toe_in_r of all four > wheels kept decreasing as shown in "toe-in.png". > > The trajectory is shown in "trajectory.png". The vehicle starts from (0,0) > and keeps turning to the left. > > Maybe the toe-in obtained from your code is still in the global frame? > > > Is toe_in_r equivalent to "δ" in the screenshot of the vehicle model > figure attached to this email? > > I want to obtain this "δ". > > > > Best regards, > > Urara > > > > > > > > On Wednesday, November 1, 2023 at 9:55:12 AM UTC-4 [email protected] wrote: > > Hello, > > > > Do you want to get the angle by which the tire-wheel steers? GetSteering > will only give you the normalized steering input (between -1 and 1) that > the driver applies onto the steering wheel at the current time step. > > If you would like to get the tire-wheel steer angle, you could do > something like this > > > > // Get the right wheel state > auto state = vehicle.GetWheel(0, > VehicleSide{RIGHT})->GetState(); > // Wheel normal (expressed in global frame) > ChVector<> wheel_normal = state.rot.GetYaxis(); > > // Terrain normal at wheel location (expressed in global frame) > ChVector<> Z_dir = terrain.GetNormal(state.pos); > > // Longitudinal (heading) and lateral directions, in the > terrain plane > ChVector<> X_dir = Vcross(wheel_normal, Z_dir); > X_dir.Normalize(); > ChVector<> Y_dir = Vcross(Z_dir, X_dir); > > // Tire reference coordinate system > ChMatrix33<> rot; > rot.Set_A_axis(X_dir, Y_dir, Z_dir); > ChCoordsys<> tire_csys(state.pos, rot.Get_A_quaternion()); > > // Express wheel normal in tire frame > ChVector<> n = > tire_csys.TransformDirectionParentToLocal(wheel_normal); > > // Wheel normal in the Vehicle frame > ChVector<> n_v = > vehicle.GetTransform().TransformDirectionParentToLocal(wheel_normal); > > // Toe-in > auto toe_in_r = std::atan2(n_v.x(), n_v.y()); > > > > However, I do not understand what you mean by "steering velocity and > acceleration", do you want to control the lateral velocity and acceleration > of the vehicle? > > > > > > > > > > > > On Monday, October 23, 2023 at 9:23:40 AM UTC-5 [email protected] > wrote: > > Hello, > > > > Thank you so much for providing this wonderful simulator. > > I'm new to Pychrono and I have a question. > > > > I'm trying to modify demo_VEH_SteeringController.py so that the vehicle > can accept steering velocity and acceleration commands. I want to convert > these two commands into throttle, brake, and steering input. > > ChPathFillowerDriver has GetSteering to get the driver steering *input,* > but how can I get the *current actual *steering angle so that I can > implement a PID controller for the steering? > > > > Or in this simulation, is it assumed that the driver steering input is > always the same as the actual steering? > > > > Best regards, > > Urara > > -- > You received this message because you are subscribed to a topic in the > Google Groups "ProjectChrono" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/projectchrono/bGrK7NFxsBI/unsubscribe > <https://urldefense.com/v3/__https:/groups.google.com/d/topic/projectchrono/bGrK7NFxsBI/unsubscribe__;!!IBzWLUs!VEreeTZm1KgpDeiWYmCTDRYWhiKJqfzXDEKYU59kbFDJ_2ZcUm7gnZiztNrlSdmlWbNvWiYj1gv6pD9ZozBOiFn11u021xw$> > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/projectchrono/235b7608-63bb-46a4-91e0-0f27f75e0e06n%40googlegroups.com > > <https://urldefense.com/v3/__https:/groups.google.com/d/msgid/projectchrono/235b7608-63bb-46a4-91e0-0f27f75e0e06n*40googlegroups.com?utm_medium=email&utm_source=footer__;JQ!!IBzWLUs!VEreeTZm1KgpDeiWYmCTDRYWhiKJqfzXDEKYU59kbFDJ_2ZcUm7gnZiztNrlSdmlWbNvWiYj1gv6pD9ZozBOiFn1bxQTjlE$> > . > > > > > -- > > *Urara Kono*, Ph.D. student > > GRASP Laboratory <https://www.grasp.upenn.edu> > > Electrical and Systems Engineering > University of Pennsylvania > > she/her/hers > > -- > You received this message because you are subscribed to a topic in the > Google Groups "ProjectChrono" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/projectchrono/bGrK7NFxsBI/unsubscribe > <https://urldefense.com/v3/__https:/groups.google.com/d/topic/projectchrono/bGrK7NFxsBI/unsubscribe__;!!IBzWLUs!VjMQTjj7XYOajqdEp2lng6LR8VoirumLVvQh9bxVJkIHsL9lfVWBopcU5pDozX8ZAUT0sVo0oEycxoQ5TyAhcEl1qA0Ruoc$> > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/projectchrono/1730ba00-7e2a-43eb-b546-e82ce77b3293n%40googlegroups.com > > <https://urldefense.com/v3/__https:/groups.google.com/d/msgid/projectchrono/1730ba00-7e2a-43eb-b546-e82ce77b3293n*40googlegroups.com?utm_medium=email&utm_source=footer__;JQ!!IBzWLUs!VjMQTjj7XYOajqdEp2lng6LR8VoirumLVvQh9bxVJkIHsL9lfVWBopcU5pDozX8ZAUT0sVo0oEycxoQ5TyAhcEl1KkAg4tw$> > . > > > > > -- > > *Urara Kono*, Ph.D. student > > GRASP Laboratory <https://www.grasp.upenn.edu> > > Electrical and Systems Engineering > University of Pennsylvania > > she/her/hers > > -- > You received this message because you are subscribed to the Google Groups > "ProjectChrono" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/projectchrono/10a6bc2f-5519-4a21-b4e3-ab79932c2765n%40googlegroups.com > > <https://groups.google.com/d/msgid/projectchrono/10a6bc2f-5519-4a21-b4e3-ab79932c2765n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "ProjectChrono" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/projectchrono/6f358adf-6ebf-4e9d-a7e7-db9ca4d2f67an%40googlegroups.com.
