方法主要制作者:郑州大学仿真实验室22级3d组章子吉,陈琦琦。
参与制作者:郑州大学仿真实验室22级3d组秦飞波,饶亦兰。
方法指导者:郑州大学仿真实验室21级3d组张佳昊,郭翼警,蔡星旖,黄世鹏,贾中天。
文章撰写者:郑州大学仿真实验室22级3d组章子吉。
特别鸣谢:南京邮电大学,安徽大学相关负责人。
方法制作时间:2024.3-2024.4
多级走路动作效果
名词解释:
速度分:即速度(m/s)乘以100√10。
源码速度分:680左右。
初版速度分:780左右。
第一版速度分:900左右(在最高速状态下,此版已舍弃)。
第二版速度分:1000左右(在最高速状态下)。
初版(非源码,已进行微调):
优化前走路
第二版效果视频:
优化后走路
动作设计
表格概括说明
第一版(已舍弃)
此版稳定性良好,但速度提升并不明显。
第二版
此版具有较好的稳定性,同时速度提升较大。
优化后代码
文件位置:magmaRelease-main/magmaagent/src/main/java/magma/agent/decision/behavior/ikMovement/walk/IKDynamicWalkMovement
将该文件替换成以下代码即可运行。
//* Copyright 2008 - 2021 Hochschule Offenburg
// * For a list of authors see README.md
// * This software of HSOAutonomy is released under GPL-3 License (see gpl.txt).
// */
//new_run_2
/* made by--
School of Computer and Artificial Intelligence, Zhengzhou University:
Simulation Lab, 3D Group 2022: Zhang Ziji,Chen Qiqi
2024.3-2024.4
*/
package magma.agent.decision.behavior.ikMovement.walk;
import hso.autonomy.util.geometry.Geometry;
import hso.autonomy.util.geometry.Pose6D;
import hso.autonomy.util.geometry.interpolation.pose.PoseInterpolator;
import magma.agent.IHumanoidConstants;
import magma.agent.model.agentmodel.SupportFoot;
import magma.agent.model.thoughtmodel.IRoboCupThoughtModel;
import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
import java.io.FileReader;
import java.util.Scanner;
public class IKDynamicWalkMovement extends IKStaticWalkMovement
{
public static final String NAME = "DynamicWalkMovement";
public static final String NAME_STABLE = "DynamicWalkMovementStable";
public static final String NAME_LOW_ACC = "DynamicWalkMovementLowAcc";
public static int stableTimes=0;
public static int stepTimes=0;
public static int ifRun=0,ifSlowing=1,ifSlowed=0,slowedSteps=0,slowingSteps=0,ifTurn=0,accelerateStep=0;
private PoseInterpolator initialPoseInterpolator;
public IKDynamicWalkMovement(IRoboCupThoughtModel thoughtModel, IKWalkMovementParametersBase params)
{
this(NAME, thoughtModel, params);
}
public IKDynamicWalkMovement(String name, IRoboCupThoughtModel thoughtModel, IKWalkMovementParametersBase params)
{
super(name, thoughtModel, params);
initialPoseInterpolator = new PoseInterpolator();
isStatic = false;
}
@Override
protected void calculateMovementTrajectory()
{
// reset the height of the initial positions to the walk height
leftFootInitialPose.z = params.getWalkHeight();
rightFootInitialPose.z = params.getWalkHeight();
double ySpeed = currentStep.forward / params.getMaxStepLength();
double xSpeed = currentStep.sideward / params.getMaxStepWidth();
double turnSpeed = currentStep.turn.degrees() / params.getMaxTurnAngle().degrees();
int cycleTime = (int) params.getCyclesPerStep();
float speed = (float) Math.max(Math.abs(turnSpeed), Math.sqrt(ySpeed * ySpeed + xSpeed * xSpeed));
Rotation orientation = worldModel.getThisPlayer().getOrientation();
// if (params.getDynamicWalk()) {
// if (Math.abs(xSpeed) > Math.abs(ySpeed)) {
// isStatic = true;
// } else {
// isStatic = false;
// }
// } else {
// isStatic = true;
// }
// if (Math.abs(orientation.getMatrix()[2][0]) > 0.34) {
// // 70 deg sidewise leaning
// cycleTime -= 2;
// } else if (Math.abs(orientation.getMatrix()[2][0]) > 0.17) {
// // 80 deg sidewise leaning
// cycleTime -= 1;
// }
double[][] matrix = orientation.getMatrix();
double hangingSide = Math.abs(matrix[2][0]);
double hangingAdjust = Geometry.getLinearFuzzyValue(0.05, 0.5, true, hangingSide) * 0.03;
// EXPERIMENT: adjust step size to front/back hanging
// double hangingFront = matrix[2][1];
// // double adjust = hangingFront * hangingFront * hangingFront;
// // adjust = ValueUtil.limitAbs(adjust, 0.2);
// // currentStep.y_targetDistance -= adjust;
// int cycleAdjust = (int) (hangingFront * 0);
// // System.out.println("hangingFront: " + hangingFront + " adjust: " + cycleAdjust);
// if (cycleAdjust > 0) {
// cycleTime += cycleAdjust;
// }
// EXPERIMENT: adjust step size to front/back hanging
//here, we set params of the phrase of speed
double basicChangeStep=3;
int stepChange=(int)basicChangeStep/2;
int SLOWSTEP=8;
if (!params.getDynamicWalk()) {
// do not adjust initial pose in case of static walk (sweaty)
setMovementCycles(cycleTime);
} else {
//
// String path="/home/d3d3d/magmaRelease-main-zzj/magmaagent/target/magmaagent/optimization/origin_p";
// String filename=path;
// float[] value = new float[130];
// String[] names = new String[130];
// int i = 1;
// try(Scanner sc = new Scanner(new FileReader(filename)))
// {
// while(sc.hasNextFloat()&&i<130)
// {
//
// value[i++] = sc.nextFloat();
// sc.nextLine();
// }
// sc.close();
// }
//normal_load
// String path="/home/d3d3d/magmaRelease-main-zzj/magmaagent/target/magmaagent/optimization/running_params";
// String filename=path;
// float[] value = new float[130];
// String[] names = new String[130];
// int i = 1;
// try(Scanner sc = new Scanner(new FileReader(filename)))
// {
// while(sc.hasNextFloat()&&i<130)
// {
//
// value[i++] = sc.nextFloat() ;
// sc.nextLine();
// }
// sc.close();
//
// }
// catch(Exception e)
// {
// e.printStackTrace();
// }
// train_load
//
// if(stepTimes>8&&ifRun==0&&ifSlowing==0){
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.015f);
// }
// else if(stepTimes>5&&ifRun==0&&ifSlowing==0){
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.020f);
// }
{
if(xSpeed>0.8)stableTimes=0;
if (ySpeed >0.9) {
stableTimes++;
}
if (ySpeed <0.7) {
stableTimes = 0;
}
if(turnSpeed>0.5){
ifTurn=1;
}
// if(turnSpeed>0.1)stableTimes=5;
if (ifTurn!=1&&ySpeed >0.95 && stableTimes > 2*basicChangeStep+5 && turnSpeed < 0.1 && turnSpeed > -0.1) {
ifRun = 1;
accelerateStep=0;
if (stableTimes % 5 == 0)
System.out.println("run param");
// params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, value[26]);
// params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, value[27]);
// params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, value[28]);
// params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, value[29]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, value[30]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, value[31]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, value[32]);
// params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, value[33]);
// params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, value[34]);
// params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, value[35]/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, value[36]);
// params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, value[37]);
// params.put(IKWalkMovementParametersBase.Param.ACCELERATION, value[38]);
// params.put(IKWalkMovementParametersBase.Param.DECELERATION, value[39]);
// params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, value[40]);
// params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, value[41]);
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, 7.6389985f);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, -0.2360075f);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, 0.07366852f);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, 0.001547157f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, 0.16403976f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, 0.07677842f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.028319346f);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 10f);
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, 0.6609124f);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, 0.0016157883f);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, 0.0014915308f);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, 9.214142E-4f);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, 0.0036981127f);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, 0.0023632266f);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, 1f);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, 3.0f);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 5.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 2.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
// params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, 8.95f);
// params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, -0.232f);
// params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, 0.09f);
// params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, 0.0013f);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, 0.145f);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, 0.121f);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.03f);
// params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 5f);
// params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, 0.66f);
// params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, 0.0015f);
// params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, 0.00175f);
// params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, 0.0019f);
// params.put(IKWalkMovementParametersBase.Param.ACCELERATION, 0.0048f);
// params.put(IKWalkMovementParametersBase.Param.DECELERATION, 0.00576f);
// params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 5.0f);
// params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 2.0f);
// params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
// params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
//other_runMove,already deleted
cycleTime = (int) params.getCyclesPerStep();
stepTimes = 0;
}
// else if (ifSlowing==0&&(ySpeed >0.9 && stableTimes > (int)(basicChangeStep+stepChange) || (stableTimes >(int)(2*basicChangeStep) && turnSpeed < 0.2 && turnSpeed > -0.2))||ifRun==1) {
else if (ifSlowing==0&&(ySpeed >0.9 && stableTimes > (int)(basicChangeStep+stepChange) || (stableTimes >(int)(2*basicChangeStep) && turnSpeed < 0.2 && turnSpeed > -0.2))||ifRun==1) {
if(ifRun==1) {
System.out.println("slowing");
ifSlowing++;
slowingSteps++;
ifSlowed=0;
}
else{
System.out.println("accelerating");
accelerateStep++;
}
if(ifTurn>0||accelerateStep>basicChangeStep*3){
ifSlowing++;
stableTimes=0;
}
if(stableTimes>18)stableTimes=0;
if(ySpeed<0.6)stableTimes=0;
if(ifSlowing> 0 )ifRun=0;
// params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, (float)(value[26]+11.0)/2);
// params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, (float)(value[27]-0.255)/2);
// params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, (float)(value[28]+0.065)/2);
// params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, (float)(value[29]+0.0)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, (float)(value[30]+0.08)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, (float)(value[31]+0.08)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, (float)(value[32]+0.02)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 15f);
// params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, (float)(value[34]+0.5)/2);
// params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, (float)(value[35]+0.0)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, (float)(value[36]+0.0)/2);
// params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, (float)(value[37]+0.0)/2);
// params.put(IKWalkMovementParametersBase.Param.ACCELERATION, (float)(value[38]+0.003)/2);
// params.put(IKWalkMovementParametersBase.Param.DECELERATION, (float)(value[39]+0.003)/2);
// params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, (float)(value[42]+0.3)/2);
// params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, (float)(value[43]+0.3)/2);
//train_load
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, (float)(9+11.0)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, (float)(-0.2360075-0.255)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, (float)(0.07366852+0.065)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, (float)(0.001547157+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, (float)(0.16403976+0.08)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, (float)(0.07677842+0.08)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, (float)(0.028319346+0.02)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, (float)(78.939476+50.0)/2);
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, (float)(0.6609124+0.5)/2);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, (float)(0.0016157883+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, (float)(0.0014915308+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, (float)(9.214142E-4+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, (float)(0.0036981127+0.003)/2);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, (float)(0.0023632266+0.003)/2);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, (float)2);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, (float)3);
params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, (float)(0.37518314+0.3)/2);
params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, (float)(0.36439905+0.3)/2);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 5.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 2.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 15.0f);
stepTimes = 0;
} else {
ifRun=0;
if(ifTurn==1){
if(slowingSteps<4)slowingSteps++;
}
ifTurn=0;
if(ifSlowing>0){
slowedSteps++;
stableTimes=0;
stepTimes=0;
}
if(slowedSteps>3) {
ifSlowing = 0;
stepTimes = 0;
slowedSteps = 0;
ifSlowed = 1;
accelerateStep = 0;
}
// params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, value[1]);
// params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, value[2]);
// params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, value[3]);
// params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, value[4]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, value[5]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, value[6]);
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, value[7]);
// params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, value[8]);
// params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, value[9]);
// params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, value[10]);
// params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, value[11]);
// params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, value[12]);
// params.put(IKWalkMovementParametersBase.Param.ACCELERATION, value[13]);
// params.put(IKWalkMovementParametersBase.Param.DECELERATION, value[14]);
// params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, value[15]);
// params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, value[16]);
// params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, value[17]);
// params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, value[18]);
// params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, value[19]);
// params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, value[20]);
// params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, value[21]);
//train_load
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, 11.0f);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, -0.255f);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, 0.065f);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, 0.08f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, 0.08f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.02f);
if(slowedSteps>=0&&slowingSteps<3){
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 15+slowedSteps*10);
}
else {
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 50.0f);
}//add with slowingSteps
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, 0.5f);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, 0.0f);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, 0.003f);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, 0.003f);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, 2.0f);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, 3.0f);
params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, 0.3f);
params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, 0.3f);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 1.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 1.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
// if (stableTimes == 1) {
// System.out.println("normal");
//
// }
cycleTime = (int) params.getCyclesPerStep();
}
}
if (speed < 0.9) {
float t = 0;
if (speed > 0.4) {
// Calculate interpolation progress between static and dynamic
// initial poses
t = ((speed - 0.4f) / 0.5f);
setMovementCycles(cycleTime - 2);
} else {
stepTimes++;
setMovementCycles(cycleTime);
// if(stepTimes>8){
//
// params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.023f);
// }
}
// Process the top view z-normalized orientation
Rotation topViewOrientation = Geometry.getTopViewOrientation(orientation);
Vector3D com = agentModel.getCenterOfMass();
// EXPERIMENT KDO shift com depending on acceleration
// double accelerationY = currentStep.forward - previousStep.forward;
// com = com.add(new Vector3D(0, accelerationY * 2, 0));
// double accelerationX = currentStep.sideward - previousStep.sideward;
// com = com.add(new Vector3D(accelerationX * 1, 0, 0));
// System.out.println("acceleration: " + accelerationY);
// Fetch current poses
Pose6D currentLeftFootPose = calculateTopViewFootPose(
agentModel.getBodyPart(IHumanoidConstants.LFoot).getPose(), topViewOrientation, com);
Pose6D currentRightFootPose = calculateTopViewFootPose(
agentModel.getBodyPart(IHumanoidConstants.RFoot).getPose(), topViewOrientation, com);
leftFootInitialPose = initialPoseInterpolator.interpolate(currentLeftFootPose, leftFootInitialPose, t);
rightFootInitialPose =
initialPoseInterpolator.interpolate(currentRightFootPose, rightFootInitialPose, t);
} else {
setMovementCycles(cycleTime - 2);
}
}
// target poses
Pose6D leftFootTargetPose = calculateFootTargetPose(currentStep, SupportFoot.LEFT, supportFoot, hangingAdjust);
Pose6D rightFootTargetPose =
calculateFootTargetPose(currentStep, SupportFoot.RIGHT, supportFoot, hangingAdjust);
interpolateMovement(leftFootTargetPose, rightFootTargetPose);
}
}
部分代码解释:
参数1-低速
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, 11.0f);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, -0.255f);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, 0.065f);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, 0.08f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, 0.08f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.02f);
if(slowedSteps>=0&&slowingSteps<3){
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 15+slowedSteps*10);
}
else {
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 50.0f);
}//add with slowingSteps
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, 0.5f);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, 0.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, 0.0f);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, 0.003f);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, 0.003f);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, 2.0f);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, 3.0f);
params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, 0.3f);
params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, 0.3f);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 1.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 1.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
参数2-加减速
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, (float)(9+11.0)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, (float)(-0.2360075-0.255)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, (float)(0.07366852+0.065)/2);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, (float)(0.001547157+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, (float)(0.16403976+0.08)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, (float)(0.07677842+0.08)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, (float)(0.028319346+0.02)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, (float)(78.939476+50.0)/2);
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, (float)(0.6609124+0.5)/2);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, (float)(0.0016157883+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, (float)(0.0014915308+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, (float)(9.214142E-4+0.0)/2);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, (float)(0.0036981127+0.003)/2);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, (float)(0.0023632266+0.003)/2);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, (float)2);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, (float)3);
params.put(IKWalkMovementParametersBase.Param.SAGGITAL_ADJUSTMENT_FACTOR, (float)(0.37518314+0.3)/2);
params.put(IKWalkMovementParametersBase.Param.CORONAL_ADJUSTMENT_FACTOR, (float)(0.36439905+0.3)/2);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 5.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 2.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 15.0f);
参数3-高速
params.put(IKWalkMovementParametersBase.Param.CYCLE_PER_STEP, 7.6389985f);
params.put(IKWalkMovementParametersBase.Param.WALK_HEIGHT, -0.2360075f);
params.put(IKWalkMovementParametersBase.Param.WALK_WIDTH, 0.07366852f);
params.put(IKWalkMovementParametersBase.Param.WALK_OFFSET, 0.001547157f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_LENGTH, 0.16403976f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_WIDTH, 0.07677842f);
params.put(IKWalkMovementParametersBase.Param.MAX_STEP_HEIGHT, 0.028319346f);
params.put(IKWalkMovementParametersBase.Param.MAX_TURN_ANGLE, 10f);
params.put(IKWalkMovementParametersBase.Param.PUSHDOWN_FACTOR, 0.6609124f);
params.put(IKWalkMovementParametersBase.Param.FOOT_SLANT_ANGLE, 0.0016157883f);
params.put(IKWalkMovementParametersBase.Param.MAX_FORWARD_LEANING, 0.0014915308f);
params.put(IKWalkMovementParametersBase.Param.MAX_SIDEWARDS_LEANING, 9.214142E-4f);
params.put(IKWalkMovementParametersBase.Param.ACCELERATION, 0.0036981127f);
params.put(IKWalkMovementParametersBase.Param.DECELERATION, 0.0023632266f);
params.put(IKWalkMovementParametersBase.Param.TURN_ACCELERATION, 1f);
params.put(IKWalkMovementParametersBase.Param.TURN_DECELERATION, 3.0f);
params.put(IKWalkMovementParametersBase.Param.SWING_ARMS, 5.0f);
params.put(IKWalkMovementParametersBase.Param.DYNAMIC_WALK, 2.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_SAGGITAL_ADJUSTMENT, 100.0f);
params.put(IKWalkMovementParametersBase.Param.MAX_ABS_CORONAL_ADJUSTMENT, 100.0f);
变量解释
stableTimes:已进行的非低速周期数
stepTimes:已进行的低速周期数
ifRun:前一周期是否运行参数3-高速
ifSlowing:前一周期是否运行参数2-加减速
ifSlowed:是否完成加减速
slowedSteps:已进行低速周期数
slowingSteps:已进行减速周期数
ifTurn:是否在进行转向
accelerateStep:已进行加速周期数
xspeed:此时一步的左右移动距离占最大一步水平移动距离的比例(0-1)
yspeed:此时一步的前后移动距离占最大一步竖直移动距离的比例(0-1)
代码解释
//here, we set params of the phrase of speed
double basicChangeStep=3;
int stepChange=(int)basicChangeStep/2;
int SLOWSTEP=8;
if (ifTurn!=1&&ySpeed >0.95 && stableTimes > 2*basicChangeStep+5 && turnSpeed < 0.1 && turnSpeed > -0.1)
else if (ifSlowing==0&&(ySpeed >0.9 && stableTimes > (int)(basicChangeStep+stepChange) || (stableTimes >(int)(2*basicChangeStep) && turnSpeed < 0.2 && turnSpeed > -0.2))||ifRun==1)
stabletimes
该变量表示稳定提速的周期数,此处关于stableTimes计算改变参数的断点,为基础断点设置,如下图所示:
在上述代码的变量参数设定中
断点1:(int)(basicChangeStep+stepChange)=4或 (int)(2*basicChangeStep)=6
断点2:2*basicChangeStep+5=11
注意到,断点设置的越远,越稳定,切换越少,但同时速度也会下降,因为达到高速的时间会减小。
ifX变量
考虑各种特殊情况设定的特殊判断标志
ifRun:前一周期是否运行参数3-高速
ifSlowing:前一周期是否运行参数2-加减速
ifSlowed:是否完成加减速
ifTurn:是否在进行转向
if(xSpeed>xx)等等
当满足以上特定条件时,强制对切换的参数进行干预。代码如下:
if(xSpeed>0.8)stableTimes=0;
if (ySpeed >0.9) {
stableTimes++;
}
if (ySpeed <0.7) {
stableTimes = 0;
}
if(turnSpeed>0.5){
ifTurn=1;
}
此为进行任何三套参数都要判断的代码
横向移动,设置为非稳定提速
竖向移动过少,设置为非稳定提速
转向速度过大,设置为非稳定提速
if(ifRun==1) {
System.out.println("slowing");
ifSlowing++;
slowingSteps++;
ifSlowed=0;
}
else{
System.out.println("accelerating");
accelerateStep++;
}
if(ifTurn>0||accelerateStep>basicChangeStep*3){
ifSlowing++;
stableTimes=0;
}
if(stableTimes>18)stableTimes=0;
if(ySpeed<0.6)stableTimes=0;
if(ifSlowing> 0 )ifRun=0;
此为进行加减速参数内的代码,通过判断上一周期的运行情况,判断是加速还是减速,又或是进行了转向。
三种情况各自进行特定的参数变量设置,确保稳定性。
ifRun=0;
ifTurn=0;
if(ifTurn==1){
if(slowingSteps<4)slowingSteps++;
}
if(ifSlowing>0){
slowedSteps++;
stableTimes=0;
stepTimes=0;
}
if(slowedSteps>3) {
ifSlowing = 0;
stepTimes = 0;
slowedSteps = 0;
ifSlowed = 1;
accelerateStep = 0;
}
此为进行参数-1内的代码,通过改变slowedStep>x的x的值(此为3)确保低速运行的最低连续周期数,保证参数不连续多次切换,确保走路动作的稳定性。
局限性
1、参数间的切换不够丝滑
在训练打分程序(decisionmaker/trainMoveStable)中,设置了调头,急停,数次转动大小幅度不同的转弯,速度等测试,综合给分。最后得到此套参数,但在实际比赛中,机器人仍会因为在不同情况的参数切换发生卡顿,重则摔倒,影响比赛成绩。
2、对接其他动作时不够流畅
在对接magma底层封装好的数个动作,如大脚,快踢,带球等,都较为流畅,不会造成过大负面影响。但在组内成员在增加新的高速快踢时,会发生偏移。即,其他动作只能与低速的走路参数对接,而不能与加减速参数对接,更不能与跑步参数对接。
3、参数数量累加受限
相比于初版两套参数的动作设计,第二版采用了三套参数的方法进行切换达到了较好的效果。但是,在增加到四套时,会出现较大问题。
在机器人急停的过程中,magma在walkToPosition中定义了变量slowDistance,并设置默认值为0.8m。因此,急停需要在0.8m内完成,才能良好的对接其他踢球动作。
但是,在设计动作之初,加减速都需至少与参数数量相同的周期数,即两套参数至少需要两周期,三套参数则至少需要三周期。而到四周期时,虽然最高速度在仍累加,但机器人无法在四周期内,0.8m的减速距离内完成四套参数的切换,若强行更改变量slowDistance的大小,又无法让机器人停到预订位置。
4、参数训练方法的局限
一套走路的参数有20余个,去除不必要参数后,仍有10个左右,随着参数套数的增加,训练的参数自由度也随之增加。这导致训练时间成几何倍数增加。在目前参数的训练过程中,采用了固定第一套低速参数,只训练第三套高速参数,两者相加除以2得第二套加减速参数的方式降低自由度。
以上减少了训练所消耗的时间。但就动作完善程度而言,并未达到该设计的最高标准。
5、底层算法局限
遗传算法具有较大随机性,无法精确的逼近该动作设计的最好参数组,只能获得大致良好的参数。
6、一套参数覆盖所有机器人
在IKDynamicWalkMovement中实现多级走路,实际上是会使用一套多级走路参数,覆盖所有种类的机器人的。但实际上,在magma底层中,每一种机器人在各自型号的文件中,是有根据不同的机器人型号来分配不同的参数的。如果每一中机器人都有自己的一套参数,或许能够提升多级走路的拓展性,稳定性和高速性。
预估可行的优化方法
1、丝滑切换
该动作代码中使用了较为简单的横向速度,水平速度等指标来决定参数的切换。但是,这并不能精准的判定出机器人此时是否稳定,适合切换另一套参数。
在magma/IKDynamicWalkMovement中,封装了如下变量:
double[][] matrix = orientation.getMatrix();
初步了解到,这里定义了三维旋转矩阵,在magma底层的摔倒爬起动作中,便是使用此变量进行判定的。
@Override
public boolean isLying()
{
return getOrientation().getMatrix()[2][2] < 0.3;
}
@Override
public boolean isLyingOnBack()
{
return getOrientation().getMatrix()[2][1] > 0.75;
}
@Override
public boolean isLyingOnFront()
{
double[][] orientation = getOrientation().getMatrix();
return orientation[2][1] < -0.75 || (orientation[2][1] < 0 && orientation[2][2] < -0.3);
}
@Override
public boolean isLeaningToSide()
{
double[][] orientation = getOrientation().getMatrix();
return orientation[2][0] > 0.7 || orientation[2][0] < -0.7;
}
预计使用此变量进行切换动作参数的判定条件,可加强在切换动作时的稳定性。
2、对接动作
或许需要其他在高速条件下触发的动作重新基于新走路来训练参数以达到目的
3、数量累加
更改动作设计,以四套加速参数为例,可将减速帧与加速帧拆分开,图示如下。
4、反向训练
以(第一套+第三套)/2得第二套的方法完成训练后,再固定第一套低速和第三套高速,反向单独训练第二套加减速参数,或能达到更好效果。
5、底层算法优化
在使用遗传算法得到较好参数后,再使用梯度下降等方法训练更精准细致的参数,或能提高效果。
6、多套多级走路
为每种机器人都训练不同的多级走路参数,或许将提升效果。
7、自定义参数
将以下自定义变量加入到参数列表,同样进行训练
stableTimes:已进行的非低速周期数
stepTimes:已进行的低速周期数
ifRun:前一周期是否运行参数3-高速
ifSlowing:前一周期是否运行参数2-加减速
ifSlowed:是否完成加减速
slowedSteps:为确保稳定已进行低速周期数
slowingSteps:已进行减速周期数
ifTurn:是否在进行转向
accelerateStep:已进行加速周期数
实施方法
了解动作框架
见安徽大学在b站发布的magma底层介绍
magmaRelease底层简单介绍_哔哩哔哩_bilibili
再次鸣谢
以走路为例:
设计动作框架
如优化后代码所示
编写打分程序
通过遗传算法生成参数进行评分
见南京邮电大学蒋旭开源的遗传算法训练脚本与视频
GitHub - RobocupApollo3d/Robocup3dSoccer: NJUPT APOLLO3D 开源Demo代码
再次鸣谢
见南京邮电大学开源的遗传算法训练脚本与视频(更新版)
再次鸣谢
选取高分参数不断迭代得结果
手动调整
具体方法见下一篇文章(点击本文末尾的连接跳转即可)
加快触发踢球动作
问题
准备大脚时,踏步过久,无法快速踢出
解决方法:
更改的文件路径名:magmaagent/src/main/java/magma/agent/decision/behavior/ikMovement/IKKickDecider.java
将以上代码:
float minX = (float) ((sideFactor * minXOffset) - MAX_HALF_STEP_WIDTH);
float maxX = (float) ((sideFactor * minXOffset) + MAX_HALF_STEP_WIDTH);
float minY = (float) -MAX_STEP_LENGTH;
float maxY = (float) (minY + Math.abs(minY) * (2 - angleFactor));
Area2D.Float kickableArea = new Area2D.Float(minX, maxX, minY, maxY);
改为:
float minX = (float) ((sideFactor * minXOffset) - MAX_HALF_STEP_WIDTH);
float maxX = (float) ((sideFactor * minXOffset) + MAX_HALF_STEP_WIDTH);
float minY = (float) -MAX_STEP_LENGTH;
float maxY = (float) (minY + Math.abs(minY) * (2 - angleFactor));
/* made by--
School of Computer and Artificial Intelligence, Zhengzhou University:
Simulation Lab, 3D Group 2022: Zhang Ziji,Chen Qiqi
2024.3-2024.4
*/
// System.out.println(minX+"\t"+maxX+"\t"+minY+"\t"+maxY);
float adjust=1.2f,
adjust1=2-adjust;
// //adjust:0-2
if(maxX<0)maxX*=adjust1;
else maxX*=adjust;
if(maxY<0)maxY*=adjust1;
else maxY*=adjust;
if(minX<0)minX*=adjust;
else minX*=adjust1;
if(minY<0)minY*=adjust;
else minY*=adjust1;
Area2D.Float kickableArea = new Area2D.Float(minX, maxX, minY, maxY);
解释
踢球判定以球为一点,机器人的脚为一点,水平竖直两个方向各计算出一个范围,在距离范围内则认为可增加踢球的在决策时被选中的分数。
使用adjust(理论范围0-2,建议范围0.8-1.4,这里选取1.2)扩大此范围,可以更快触发踢球
已测试得,在变量adjust过大时,会反复空脚,过小时,会更难触发踢球。
基于以上解决方法的其他优化
kick11m优化
在扩大踢球范围后,再去训练nao与naotoe机器人的11m,可以得到较好结果,训练结果(naotoe)如下:
路径:magmaagent/src/main/java/magma/robots/naotoe/decision/behavior/movement/Kick11mParametersToe.java
/* Copyright 2008 - 2021 Hochschule Offenburg
* For a list of authors see README.md
* This software of HSOAutonomy is released under GPL-3 License (see gpl.txt).
*/
package magma.robots.naotoe.decision.behavior.movement;
import magma.agent.decision.behavior.base.KickDistribution;
import magma.robots.nao.decision.behavior.movement.kick.Kick11mParameters;
public class Kick11mParametersToe extends Kick11mParameters
{
@Override
protected void setValues()
{
/* made by--
School of Computer and Artificial Intelligence, Zhengzhou University:
Simulation Lab, 3D Group 2022: Zhang Ziji,Chen Qiqi
2024.3-2024.4
*/
put(Param.TIME0, 8.43562f);
put(Param.TIME1, 44.55691f);
put(Param.TIME2, 6.6185536f);
put(Param.TIME3, 2.6462412f);
put(Param.LHP1, -28.78391f);
put(Param.RHP1, -24.40872f);
put(Param.RKP1, -47.492573f);
put(Param.RFP1, -0.6660357f);
put(Param.RTP1, 36.505157f);
put(Param.LHP2, -28.306526f);
put(Param.LHYP1, -17.089981f);
put(Param.LHYPS1, 10.284329f);
put(Param.LHYPS2, 2.8803697f);
put(Param.RHYP2, -5.7316093f);
put(Param.RHP2, 128.9313f);
put(Param.RKP2, -34.06021f);
put(Param.RFP2, -27.969841f);
put(Param.RTP2, 48.205994f);
put(Param.RKPS1, 5.892886f);
put(Param.RHPS2, 7.456277f);
put(Param.RHYPS2, 5.9475956f);
put(Param.RFPS2, 9.893458f);
put(Param.RHR2, -0.11257782f);
put(Param.LHR1, -5.2105947f);
put(Param.LKP2, -33.005646f);
put(Param.LFP2, -4.6644487f);
put(Param.POS_X, 0.10845645f);
put(Param.POS_Y, -0.15371859f);
put(Param.KICK_ANGLE, -57.88803f);
put(Param.MIN_X_OFFSET, 0.18253876f);
put(Param.RUN_TO_X, -0.10877407f);
put(Param.RUN_TO_Y, 0.037190493f);
put(Param.CANCEL_DISTANCE, 0.3077898f);
put(Param.STABILIZE_TIME, 11.102401f);
//原始
// put(Param.TIME0, 5.980542f);
// put(Param.TIME1, 47.67634f);
// put(Param.TIME2, 5.2337775f);
// put(Param.TIME3, 2.0126028f);
// put(Param.LHP1, -21.672497f);
// put(Param.RHP1, -25.013222f);
// put(Param.RKP1, -43.00942f);
// put(Param.RFP1, -0.60380554f);
// put(Param.RTP1, 24.458244f);
// put(Param.LHP2, -16.346897f);
// put(Param.LHYP1, -25.416431f);
// put(Param.LHYPS1, 5.880075f);
// put(Param.LHYPS2, 5.0096493f);
// put(Param.RHYP2, -4.299588f);
// put(Param.RHP2, 91.211365f);
// put(Param.RKP2, -31.679153f);
// put(Param.RFP2, -31.228767f);
// put(Param.RTP2, 44.641968f);
// put(Param.RKPS1, 4.759756f);
// put(Param.RHPS2, 6.428073f);
// put(Param.RHYPS2, 4.850277f);
// put(Param.RFPS2, 5.503548f);
// put(Param.RHR2, -0.097299576f);
// put(Param.LHR1, -3.3772464f);
// put(Param.LKP2, -25.888914f);
// put(Param.LFP2, -4.456583f);
// put(Param.POS_X, 0.11011081f);
// put(Param.POS_Y, -0.13241145f);
// put(Param.KICK_ANGLE, -37.096344f);
// put(Param.MIN_X_OFFSET, 0.1260245f);
// put(Param.RUN_TO_X, -0.17275508f);
// put(Param.RUN_TO_Y, 0.021898419f);
// put(Param.CANCEL_DISTANCE, 0.23550412f);
// put(Param.STABILIZE_TIME, 12.8303795f);
// Average utility: 8.863 averaged: 50, properties: {
// "ballX": 9.466,
// "ballY": -0.028,
// "targetDistanceX": 1.82,
// "targetDistanceY": 0.623,
// "distanceXY": 2.137
// }
distribution =
new KickDistribution(new double[] {0.085, 0.008, 0.005, 0.008, 0.005, 0.008, 0.028, 0.013, 0.02, 0.005,
0.005, 0.01, 0.012, 0.005, 0.005, 0.004, 0.012, 0.018, 0.04, 0.084, 0.181,
0.167, 0.128, 0.078, 0.03, 0.018, 0.008, 0.008, 0.002},
new double[] {0.186, 0.207, 0.174, 0.135, 0.072, 0.05, 0.037, 0.017, 0.018, 0.011, 0.008, 0.007,
0.009, 0.009, 0.011, 0.005, 0.002, 0.0, 0.002, 0.004, 0.003, 0.007, 0.008, 0.0, 0.002,
0.002, 0.0, 0.002, 0.002, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.002, 0.001, 0.0, 0.001, 0.0,
0.0, 0.0, 0.0, 0.001, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001});
}
}
整套训练用代码使用讲解
该附件代码未经整理,较难阅读,讲解视频已更新
关于robocup仿真3d,即rcsoccersim3d的基于magma底层的简单动作设计方法,训练方法以及优化方法_哔哩哔哩_bilibili
请查看后续文章
关于robocup仿真3d,即rcsoccersim3d的基于magma底层的简单动作设计方法,训练方法以及优化方法-CSDN博客
为规避直接复制黏贴,鼓励共同改进,此文与后续更新的相关视频仅介绍打分程序编写方法和训练方法示例程序,而不提供目前最优程序
声明
此文并未涵盖2022级郑州大学robocup仿真3d组所有的代码更改与改进。
为鼓励实际的工作与优化,此文中代码的参数并非本组训练出的最好参数,但只要按文中与视频中的方法复现,只需使用个人电脑训练1-3天,即可达到文章开头所示效果