首先启动仿真
cd ~/wbc_v5/build
./sim/sim
界面选择好后,在build目录下ctrl+shift+t开启新终端,运行MIT控制器。
./user/MIT_Controller/mit_ctrl m s
在中央面板中,将 use_rc 设置为 0,
将 control_mode 改为 6 (recovery stand), 运行到站立姿态
将 control_mode 改为 3 (balance stand), 平衡站立(力控状态)
将 control_mode 改为 4 (locomotion), 此时开始走路,修改在/home/quadruped/wbc_v5_usb/user/MIT_Controller/Controllers/convexMPC目录下的ConvexMPCLocomotion.cpp文件,不修改的话,默认进行以 Tort 步态运行。
重点来了,在运行的同时,切换目录到 cd ~/wbc_v5/scripts
运行如下指令,打开LCM spy程序,显示来自模拟器和控制器的详细信息,可以看到新窗口,鼠标双击能看到实时数据流和数据曲线。
cd ~/wbc_v5/scripts
./launch_lcm_spy.sh
运行lcm-logger,记录数据
lcm-logger
ctrl+c后,结束记录,在目录下生成了lcmlog-2022-04-15.00的文件,将日志文件转换为.mat文件用于MATLAB的读取。
./log_convert.sh -o lcmlog-2022-04-15.00
生成-o.mat文件,重命名为o.mat后,可以直接在MATLAB中读取,数据都是以结构体的形式进行保存的。
load("o.mat")
数据的结构目录如下:
global_to_robot =
rpy: [4044×3 double]%身体姿态角
omegaBody: [4044×3 double]%都是零
xyz: [4044×3 double]%身体坐标
vxyz: [4044×3 double]%都是零
lcm_timestamp: [1×4044 double]%时间戳
leg_control_command = %腿部运动的控制指令
f_ff: [4044×12 double]%都是零
v_des: [4044×12 double]%期望足端速度,触地时刻为0
qd_des: [4044×12 double]
tau_ff: [4044×12 double]%前馈的关节扭矩
kp_joint: [4044×12 double]%常数矩阵,关节控制器kp
kd_joint: [4044×12 double]%常数矩阵,关节控制器kd
p_des: [4044×12 double]%都是零
kd_cartesian: [4044×12 double]%矩形波状常数矩阵
q_des: [4044×12 double]%期望的关节角
kp_cartesian: [4044×12 double]%都是零
lcm_timestamp: [1×4044 double]%时间戳
leg_control_data = %采集到的腿部数据,用于控制器计算
lcm_timestamp: [1×4044 double]%时间戳
q: [4044×12 double]%关节角度
p: [4044×12 double]%足端位置的坐标,相对于髋关节坐标系
qd: [4044×12 double]%关节角速度
v: [4044×12 double]
tau_est: [4044×12 double]%都是零
simulator_state = %仿真器输出的机器人状态数据
vb: [4043×3 double]
vbd: [4043×3 double]%几乎都是接近于零
rpy: [4043×3 double]
quat: [4043×4 double]
v: [4043×3 double]
lcm_timestamp: [1×4043 double]%时间戳
omegab: [4043×3 double]
p: [4043×3 double]
time: [1×4043 double]
timesteps: [1×4043 int64]%仿真的时间步数
omega: [4043×3 double]
spi_debug_cmd = %用于调试的接口的数据
f_ff: [405×12 double]
v_des: [405×12 double]
qd_des: [405×12 double]
tau_ff: [405×12 double]
kp_joint: [405×12 double]
kd_joint: [405×12 double]
p_des: [405×12 double]
kd_cartesian: [405×12 double]
q_des: [405×12 double]
kp_cartesian: [405×12 double]
lcm_timestamp: [1×405 double]
state_estimator =
omegaWorld: [4044×3 double]
aWorld: [4044×3 double]
vBody: [4044×3 double]
rpy: [4044×3 double]
quat: [4044×4 double]
lcm_timestamp: [1×4044 double]
aBody: [4044×3 double]
p: [4044×3 double]
vRemoter: [4044×3 double]
omegaBody: [4044×3 double]
vWorld: [4044×3 double]
wbc_lcm_data =
foot_local_vel: [4044×12 double]
foot_vel: [4044×12 double]
foot_pos_cmd: [4044×12 double]
foot_acc_cmd: [4044×12 double]
body_vel_cmd: [4044×3 double]
jvel: [4044×12 double]
Fr: [4044×12 double]
lcm_timestamp: [1×4043 double]
jpos: [4044×12 double]
Fr_des: [4044×12 double]
body_vel: [4044×3 double]
jpos_cmd: [4044×12 double]
jvel_cmd: [4044×12 double]
body_ang_vel: [4044×3 double]
body_ori_cmd: [4044×4 double]
contact_est: [4044×4 int64]
body_pos_cmd: [4044×3 double]
body_ang_vel_cmd: [4044×3 double]
body_pos: [4044×3 double]
foot_local_pos: [4044×12 double]
foot_pos: [4044×12 double]
body_ori: [4044×4 double]
vision_loc: [4044×3 double]
foot_vel_cmd: [4044×12 double]
foot_acc_numeric: [4044×12 double]
jacc_cmd: [4044×12 double]