Representation of 3D forces =========================== .. container:: python .. highlight:: python In the 3D window of the animation there is the option to represent the evolution of some properties of the external forces. They are two ways to represent external forces: - Visualize force components in the reference fixed-frame (the inertial frame) - Visualize force components in a moving frame Below, there are two examples, one for each of the two above mentioned options. REMARK: The minimum Robotran version required is v1.16.3 Basic example: visualization of force components in the reference fixed-frame ----------------------------------------------------------------------------- Visualizing 3D forces in MBsysPad requires additional \*.anim files, one for each external force. Those files will be loaded automatically when you select the main \*.anim file of your simulation (generally the main \*.anim file ends by \_q.anim). The steps below explain how to generate those files. REMARK: The external force \*.anim file format The file must contain one line for each frame of the animation. The time step size between frames must be the same as in the main \*.anim file. Each line must contain the following information :: t_int F_I_1 F_I_2 F_I_3 M_I_1 M_I_2 M_I_3 dxF_1 dxF_2 dxF_3 with: - t_int ==> the time - [F_I_1, F_I_2, F_I_3] ==> the force components in the inertial frame (as returned by the user_extForces function). - [M_I_1, M_I_2, M_I_3] ==> the torque components in the inertial frame (as returned by the user_extForces function). - [dxF_1, dxF_2, dxF_3] ==> the position of application point of the force (the point where we want to draw the force), with respect to the external force body reference point in the body fixed frame (as returned by the user_extForces function). Step 1: Edit the user files and define the forces vector ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - In the *user_dirdyn* user file, edit the *user_dirdyn_init* function to initialize the forces vector: .. container:: python .. code:: python def user_dirdyn_init(mbs_data, dd): #... # define the name and the size of the output vector mbs_data.define_output_vector("forces", 9) #... - Edit the *user_ExtForces* function to define the output vector. For the case of the reference fixed-frame, this vector will contain 1 value of time and 9 values that corresponds to the Swr vector: the force components in the inertial time (3), the torque components in the inertial frame (3) and the position of the application point of the force (3). .. container:: python .. code:: python def user_ExtForces(PxF,RxF,VxF,OMxF,AxF,OMPxF,mbs_data,tsim,ixF): #... # define the vector during the direct dynamics process if mbs.process == 3: # the same process as that defined for the dynamics analysis # compute and fill the Swr vector # introduce the forces, torques and application point position to the output vector mbs_data.set_output_vector(Swr[1:],'forces') #the set_output_vector already automatically includes the time #... Step 2: Run your simulation and obtain the forces file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Before running the simulation, you must modify the main script in order to create a file *.anim* that will contain the output vector defined in the previous section for each time step. To adapt the time values to the frame rate of the animation file that you want to create, you must do an interpolation of the time and the force vector values. Concerning the name of this file, it must follow the next structure: *SimulationName_xFrc_ForceName.anim*. The first part (*SimulationName*) must have the simulation parameter (introduced in the *resfilename* option), the second part is *xFrc* and the third one must have the name of the force in the MBsysPad model (*ForceName*). - Edit the *main* file to create the *.anim* file: .. container:: python .. code:: python ##============================================================================== ## Postprocess ##============================================================================== import numpy as np from scipy import interpolate t_fin = mbs_dirdyn.get_options('tf') # end time frame_rate = mbs_dirdyn.get_options('framerate') # number of frame per second for the animation file dt = 1./frame_rate # time step t_anim = np.arange(0, t_fin, dt) # the time values to interpolate frc_res = np.loadtxt("../resultsR/dirdyn_forces.res") # time and force values of the simulation frc_anim = interpolate.interp1d(frc_res[:,0], frc_res, axis=0)(t_anim) # Interpolation of forces and time np.savetxt('../animationR/dirdyn_xFrc_LateralBumpstop.anim',frc_anim) # Save values .anim file Step 3: Open the 3D MBS ~~~~~~~~~~~~~~~~~~~~~~~ - Open your \*.mbs file in MBsysPad - Click the *Animate 3D Model* button .. figure:: figure/animate3D_snapshot_animateIcon.png :alt: Snapshot of the Animate 3D icon Snapshot of the Animate 3D ll icon - Load the result file - Click on the Open button - Select the *.anim file equivalent to the simulation, in this case*\ dirdyn_q.anim\* (not the auxiliar .anim file created in the Postprocess) - Activate the force you want to edit - Click on the force sensor in the 2D view - Or go to the 3D view and, in the right panel, use the drop down menu of the Comp tab .. figure:: figure/specificFeatures_Force_choice.png :alt: 3D object selection menu 3D object selection menu - Edit the 3D force and 3D torque: - Activate or desactivate the visible components of the force/torque - Make visible the resultant of some components of the force/torque - Modifiy the arrow properties: diameter, scale and position of the arrow |3D properties panel for forces| |3D properties panel for torques| - Use the control buttons to run the animation and to see the force evolution .. figure:: figure/specificFeatures_Force_representation.png :alt: 3D forces representation 3D forces representation .. REMARK: By default, forces are displayed and torques are hidden. .. REMARK: For every force that you want to show, you will have to create a different vector, so a different *.anim* file. By default we allow the user to save up to 12 vectors, if you need more output value update the option ``max_save_user`` with the function ``MbsDirdyn.set_options()``. Advanced example: visualization of force components in a moving frame --------------------------------------------------------------------- .. _step-1-edit-the-user-files-and-define-the-forces-vector-1: Step 1: Edit the user files and define the forces vector ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - In the *user_dirdyn* user file, edit the *user_dirdyn_init* function to initialize the forces vector: .. container:: python .. code:: python def user_dirdyn_init(mbs_data, dd): #... # define the name and the size of the output vector mbs_data.define_output_vector("forces", 15) #... - Edit the *user_ExtForces* function to define the output vector. For the case of the moving frame, this vector will contain 1 column of time, 9 columns of the Swr vector and 6 new columns that correspond to the values of the first two rows of the rotation matrix that goes from the inertial frame to the body frame (*R_X_I*). .. container:: python .. code:: python import numpy as np import MBsysPy def user_ExtForces(PxF,RxF,VxF,OMxF,AxF,OMPxF,mbs_data,tsim,ixF): #... # define the vector during the direct dynamics process if mbs.process == 3: # the same process as that defined for the dynamics analysis # compute and fill the Swr vector # introduce the forces, torques, application point position and two rows of the rotation matrix to the output vector twoRows_R_X_I = [R_X_I_11, R_X_I_12, R_X_I_13, R_X_I_21, R_X_I_22, R_X_I_23] #first two rows components of the rotation matrix vect_forc = np.append(Swr[1:],twoRows_R_X_I) #adding the rotation matrix components to the vector with forces, torques & position vector mbs_data.set_output_vector(vect_forc,'forces') #the set_output_vector already automatically includes the time #... .. REMARK: The external force \*.anim file format The file must contain one line for each frame of the animation. The time step size between frames must be the same as in the main \*.anim file. Each line must contain the following information :: t_int F_I_1 F_I_2 F_I_3 M_I_1 M_I_2 M_I_3 dxF_1 dxF_2 dxF_3 R_X_I_11 R_X_I_12 R_X_I_13 R_X_I_21 R_X_I_22 R_X_I_23 with: - t_int ==> the time - [F_I_1, F_I_2, F_I_3] ==> the force components in the inertial frame (as returned by the user_extForces function). - [M_I_1, M_I_2, M_I_3] ==> the torque components in the inertial frame (as returned by the user_extForces function). - [dxF_1, dxF_2, dxF_3] ==> the position of application point of the force (the point where we want to draw the force), with respect to the external force body reference point in the body fixed frame (as returned by the user_extForces function). - [R_X_I_11, R_X_I_12, R_X_I_13, R_X_I_21, R_X_I_22, R_X_I_23] ==> first two rows elements of the rotation matrix that goes from the inertial frame to the frame in which the force component must be displayed. The third row is calculated internally. .. _step-2-run-your-simulation-and-obtain-the-forces-file-1: Step 2: Run your simulation and obtain the forces file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Before running the simulation, you must modify the main script in order to create a file *.anim* that will contain the output vector defined in the previous section for each time step. To adapt the time values to the frame rate of the animation file that you want to create, you must do an interpolation of the time and the force vector values. Concerning the name of the file, it must follow the next structure: *SimulationName_xFrc_ForceName.anim*. The first part (*SimulationName*) must have the simulation parameter (introduced in the *resfilename* option), the second part is *xFrc* and the third one must have the name of the force in the MBsysPad model (*ForceName*). - Edit the *main* file to create the *.anim* file: .. container:: python .. code:: python ##============================================================================== ## Postprocess ##============================================================================== import numpy as np from scipy import interpolate t_fin = mbs_dirdyn.get_options('tf') # end time frame_rate = mbs_dirdyn.get_options('framerate') # number of frame per second for the animation file dt = 1./frame_rate # time step t_anim = np.arange(0, t_fin, dt) # the time values to interpolate frc_res = np.loadtxt("../resultsR/dirdyn_forces.res") # time and force values of the simulation frc_anim = interpolate.interp1d(frc_res[:,0], frc_res, axis=0)(t_anim) # Interpolation of forces and time np.savetxt('../animationR/dirdyn_xFrc_LateralBumpstop.anim',frc_anim) # Save values .anim file .. _step-3-open-the-3d-mbs-1: Step 3: Open the 3D MBS ~~~~~~~~~~~~~~~~~~~~~~~ - Open your \*.mbs file in MBsysPad - Click the *Animate 3D Model* button .. figure:: figure/animate3D_snapshot_animateIcon.png :alt: Snapshot of the Animate 3D icon Snapshot of the Animate 3D ll icon - Load the result file - Click on the Open button - Select the *.anim file equivalent to the simulation, in this case*\ dirdyn_q.anim\* (not the auxiliar .anim file created in the Postprocess) - Activate the force you want to edit - Click on the body in the 2D view - Or go to the 3D view and, in the right panel, use the drop down menu of the Comp tab .. figure:: figure/specificFeatures_Force_choice.png :alt: 3D object selection menu 3D object selection menu - Edit the 3D force and 3D torque: - Activate or desactivate the visible components of the force/torque - Make visible the resultant of some components of the force/torque - Modifiy the arrow properties: diameter, scale and position of the arrow |3D properties panel for forces| |3D properties panel for torques| - Use the control buttons to run the animation and to see the force evolution in different visible properties options (in the next figures, you can see a representation of forces and torques): .. figure:: figure/specificFeatures_Advanced_Forces.png :alt: 3D forces representation in the advanced model 3D forces representation in the advanced model .. figure:: figure/specificFeatures_Advanced_Torques.png :alt: 3D torques representation in the advanced model 3D torques representation in the advanced model .. REMARK: For every force that you want to show, you will have to create a different vector, so a different *.anim* file. By default we allow the user to save up to 12 vectors, if you need more output value update the option ``max_save_user`` with the function ``MbsDirdyn.set_options()``. .. REMARK: This feature is also valid for the analysis of inverse dynamics. .. |3D properties panel for forces| image:: figure/specificFeatures_Force_properties.png .. |3D properties panel for torques| image:: figure/specificFeatures_Torque_properties.png