@@ -1876,9 +1876,7 @@ def control_dofs_velocity(self, velocity, dofs_idx=None, envs_idx=None, *, unsaf
18761876 velocity , dofs_idx , envs_idx , self .dofs_state , self .dofs_info , self ._static_rigid_sim_config
18771877 )
18781878 if not unsafe and not has_gains :
1879- raise gs .raise_exception (
1880- "Please set control gains kp,kv using `set_dofs_kp`,`set_dofs_kv` prior to calling this method."
1881- )
1879+ raise gs .raise_exception ("Please set control gains kv using `set_dofs_kv` prior to calling this method." )
18821880
18831881 def control_dofs_position (self , position , dofs_idx = None , envs_idx = None , * , unsafe = False ):
18841882 position , dofs_idx , envs_idx = self ._sanitize_1D_io_variables (
@@ -1889,9 +1887,25 @@ def control_dofs_position(self, position, dofs_idx=None, envs_idx=None, *, unsaf
18891887 has_gains = kernel_control_dofs_position (
18901888 position , dofs_idx , envs_idx , self .dofs_state , self .dofs_info , self ._static_rigid_sim_config
18911889 )
1890+ if not unsafe and not has_gains :
1891+ raise gs .raise_exception ("Please set control gains kp using `set_dofs_kp` prior to calling this method." )
1892+
1893+ def control_dofs_position_velocity (self , position , velocity , dofs_idx = None , envs_idx = None , * , unsafe = False ):
1894+ position , dofs_idx , _ = self ._sanitize_1D_io_variables (
1895+ position , dofs_idx , self .n_dofs , envs_idx , skip_allocation = True , unsafe = unsafe
1896+ )
1897+ velocity , dofs_idx , envs_idx = self ._sanitize_1D_io_variables (
1898+ velocity , dofs_idx , self .n_dofs , envs_idx , skip_allocation = True , unsafe = unsafe
1899+ )
1900+ if self .n_envs == 0 :
1901+ position = position .unsqueeze (0 )
1902+ velocity = velocity .unsqueeze (0 )
1903+ has_gains = kernel_control_dofs_position_velocity (
1904+ position , velocity , dofs_idx , envs_idx , self .dofs_state , self .dofs_info , self ._static_rigid_sim_config
1905+ )
18921906 if not unsafe and not has_gains :
18931907 raise gs .raise_exception (
1894- "Please set control gains kp, kv using `set_dofs_kp`,`set_dofs_kv` prior to calling this method."
1908+ "Please set control gains kp and/or kv using `set_dofs_kp`,`set_dofs_kv` prior to calling this method."
18951909 )
18961910
18971911 def get_sol_params (self , geoms_idx = None , envs_idx = None , * , joints_idx = None , eqs_idx = None , unsafe = False ):
@@ -3232,8 +3246,9 @@ def func_compute_mass_matrix(
32323246 rigid_global_info .mass_mat [i_d , i_d , i_b ] += (
32333247 dofs_info .damping [I_d ] * rigid_global_info .substep_dt [None ]
32343248 )
3235- if (dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION ) or (
3236- dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
3249+ if (
3250+ dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION
3251+ or dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
32373252 ):
32383253 # qM += d qfrc_actuator / d qvel
32393254 rigid_global_info .mass_mat [i_d , i_d , i_b ] += (
@@ -3308,8 +3323,9 @@ def func_compute_mass_matrix(
33083323 for i_d , i_b in ti .ndrange (n_dofs , _B ):
33093324 I_d = [i_d , i_b ] if ti .static (static_rigid_sim_config .batch_dofs_info ) else i_d
33103325 rigid_global_info .mass_mat [i_d , i_d , i_b ] += dofs_info .damping [I_d ] * rigid_global_info .substep_dt [None ]
3311- if (dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION ) or (
3312- dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
3326+ if (
3327+ dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION
3328+ or dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
33133329 ):
33143330 # qM += d qfrc_actuator / d qvel
33153331 rigid_global_info .mass_mat [i_d , i_d , i_b ] += dofs_info .kv [I_d ] * rigid_global_info .substep_dt [None ]
@@ -3351,8 +3367,9 @@ def func_factor_mass(
33513367 dofs_info .damping [I_d ] * rigid_global_info .substep_dt [None ]
33523368 )
33533369 if ti .static (static_rigid_sim_config .integrator == gs .integrator .implicitfast ):
3354- if (dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION ) or (
3355- dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
3370+ if (
3371+ dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION
3372+ or dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
33563373 ):
33573374 rigid_global_info .mass_mat_L [i_d , i_d , i_b ] += (
33583375 dofs_info .kv [I_d ] * rigid_global_info .substep_dt [None ]
@@ -3391,8 +3408,9 @@ def func_factor_mass(
33913408 dofs_info .damping [I_d ] * rigid_global_info .substep_dt [None ]
33923409 )
33933410 if ti .static (static_rigid_sim_config .integrator == gs .integrator .implicitfast ):
3394- if (dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION ) or (
3395- dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
3411+ if (
3412+ dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION
3413+ or dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
33963414 ):
33973415 rigid_global_info .mass_mat_L [i_d , i_d , i_b ] += (
33983416 dofs_info .kv [I_d ] * rigid_global_info .substep_dt [None ]
@@ -4044,8 +4062,8 @@ def func_implicit_damping(
40444062 rigid_global_info .mass_mat_mask [i_e , i_b ] = True
40454063 if ti .static (static_rigid_sim_config .integrator != gs .integrator .Euler ):
40464064 if (
4047- ( dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION )
4048- or ( dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY )
4065+ dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION
4066+ or dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY
40494067 ) and dofs_info .kv [I_d ] > gs .EPS :
40504068 rigid_global_info .mass_mat_mask [i_e , i_b ] = True
40514069
@@ -5320,10 +5338,9 @@ def func_torque_and_passive_force(
53205338 elif dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION and not (
53215339 joint_type == gs .JOINT_TYPE .FREE and i_d >= links_info .dof_start [I_l ] + 3
53225340 ):
5323- force = (
5324- dofs_info .kp [I_d ] * (dofs_state .ctrl_pos [i_d , i_b ] - dofs_state .pos [i_d , i_b ])
5325- - dofs_info .kv [I_d ] * dofs_state .vel [i_d , i_b ]
5326- )
5341+ force = dofs_info .kp [I_d ] * (
5342+ dofs_state .ctrl_pos [i_d , i_b ] - dofs_state .pos [i_d , i_b ]
5343+ ) + dofs_info .kv [I_d ] * (dofs_state .ctrl_vel [i_d , i_b ] - dofs_state .vel [i_d , i_b ])
53275344
53285345 dofs_state .qf_applied [i_d , i_b ] = ti .math .clamp (
53295346 force ,
@@ -6643,7 +6660,7 @@ def kernel_control_dofs_velocity(
66436660 I_d = [i_d , i_b ] if ti .static (static_rigid_sim_config .batch_dofs_info ) else i_d
66446661 dofs_state .ctrl_mode [i_d , i_b ] = gs .CTRL_MODE .VELOCITY
66456662 dofs_state .ctrl_vel [i_d , i_b ] = velocity [i_b_ , i_d_ ]
6646- if ( dofs_info .kp [ I_d ] > gs . EPS ) | ( dofs_info . kv [I_d ] > gs .EPS ) :
6663+ if dofs_info .kv [I_d ] > gs .EPS :
66476664 has_gains = True
66486665 return has_gains
66496666
@@ -6666,6 +6683,32 @@ def kernel_control_dofs_position(
66666683 I_d = [i_d , i_b ] if ti .static (static_rigid_sim_config .batch_dofs_info ) else i_d
66676684 dofs_state .ctrl_mode [i_d , i_b ] = gs .CTRL_MODE .POSITION
66686685 dofs_state .ctrl_pos [i_d , i_b ] = position [i_b_ , i_d_ ]
6686+ dofs_state .ctrl_vel [i_d , i_b ] = 0.0
6687+ if dofs_info .kp [I_d ] > gs .EPS :
6688+ has_gains = True
6689+ return has_gains
6690+
6691+
6692+ @ti .kernel (fastcache = gs .use_fastcache )
6693+ def kernel_control_dofs_position_velocity (
6694+ position : ti .types .ndarray (),
6695+ velocity : ti .types .ndarray (),
6696+ dofs_idx : ti .types .ndarray (),
6697+ envs_idx : ti .types .ndarray (),
6698+ dofs_state : array_class .DofsState ,
6699+ dofs_info : array_class .DofsInfo ,
6700+ static_rigid_sim_config : ti .template (),
6701+ ) -> ti .i32 :
6702+ has_gains = gs .ti_bool (False )
6703+ ti .loop_config (serialize = ti .static (static_rigid_sim_config .para_level < gs .PARA_LEVEL .PARTIAL ))
6704+ for i_d_ , i_b_ in ti .ndrange (dofs_idx .shape [0 ], envs_idx .shape [0 ]):
6705+ i_d = dofs_idx [i_d_ ]
6706+ i_b = envs_idx [i_b_ ]
6707+
6708+ I_d = [i_d , i_b ] if ti .static (static_rigid_sim_config .batch_dofs_info ) else i_d
6709+ dofs_state .ctrl_mode [i_d , i_b ] = gs .CTRL_MODE .POSITION
6710+ dofs_state .ctrl_pos [i_d , i_b ] = position [i_b_ , i_d_ ]
6711+ dofs_state .ctrl_vel [i_d , i_b ] = velocity [i_b_ , i_d_ ]
66696712 if (dofs_info .kp [I_d ] > gs .EPS ) | (dofs_info .kv [I_d ] > gs .EPS ):
66706713 has_gains = True
66716714 return has_gains
@@ -6747,10 +6790,9 @@ def kernel_get_dofs_control_force(
67476790 elif dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .VELOCITY :
67486791 force = dofs_info .kv [I_d ] * (dofs_state .ctrl_vel [i_d , i_b ] - dofs_state .vel [i_d , i_b ])
67496792 elif dofs_state .ctrl_mode [i_d , i_b ] == gs .CTRL_MODE .POSITION :
6750- force = (
6751- dofs_info .kp [I_d ] * (dofs_state .ctrl_pos [i_d , i_b ] - dofs_state .pos [i_d , i_b ])
6752- - dofs_info .kv [I_d ] * dofs_state .vel [i_d , i_b ]
6753- )
6793+ force = dofs_info .kp [I_d ] * (dofs_state .ctrl_pos [i_d , i_b ] - dofs_state .pos [i_d , i_b ]) + dofs_info .kv [
6794+ I_d
6795+ ] * (dofs_state .ctrl_vel [i_d , i_b ] - dofs_state .vel [i_d , i_b ])
67546796 tensor [i_b_ , i_d_ ] = ti .math .clamp (
67556797 force ,
67566798 dofs_info .force_range [I_d ][0 ],
0 commit comments