forked from Dknt0/bitbot_gz
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathuser_func.cpp
More file actions
executable file
·151 lines (128 loc) · 5.47 KB
/
Copy pathuser_func.cpp
File metadata and controls
executable file
·151 lines (128 loc) · 5.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
* @file user_func.cpp
* @author Zishun Zhou
* @brief
* @date 2025-03-10
*
* @copyright Copyright (c) 2025
*
*/
#include "user_func.h"
#include <chrono>
#define _USE_MATH_DEFINES
#include <cmath>
#include <ctime>
#include <memory>
#include <thread>
#include <iostream> // std::cout
#include <nlohmann/json.hpp>
#include <fstream>
#include "types.hpp"
// 辅助函数:对容器中的每个元素应用函数
template <typename Container, typename Func>
void Apply(Container& container, Func func)
{
for (size_t i = 0; i < container.size(); ++i)
{
func(&container[i], i);
}
}
void ConfigFunc(const KernelBus& bus, UserData& d)
{
//读取json配置文件,并初始化各个worker
nlohmann::json cfg_root;
nlohmann::json cfg_workers;
{
//NOTE: 注意将配置文件路径修改为自己的路径
std::string path = PROJECT_ROOT_DIR + std::string("/settings/CtrlConfig.json");
std::ifstream cfg_file(path);
cfg_root = nlohmann::json::parse(cfg_file, nullptr, true, true);
cfg_workers = cfg_root["Workers"];
}
//获取设备指针
d.ImuPtr = bus.GetDevice<DeviceImu>(IMU_ID_MAP).value();
d.ImuAlterPtr = bus.GetDevice<DeviceImu>(ALTER_IMU_ID_MAP).value();
Apply(d.JointsPtr, [&bus](DeviceJoint** joint, size_t i)
{ *joint = bus.GetDevice<DeviceJoint>(JOINT_ID_MAP[i]).value(); });
//创建调度器
d.TaskScheduler = SchedulerType::Create(cfg_root["Scheduler"]);
//初始化各个worker
d.ImuWorker = d.TaskScheduler->template CreateWorker<ImuWorkerType>(d.ImuPtr, cfg_workers["ImuProcess"]);
d.MotorWorker = d.TaskScheduler->template CreateWorker<MotorWorkerType>(cfg_workers["MotorControl"], d.JointsPtr);
d.Logger = d.TaskScheduler->template CreateWorker<LoggerWorkerType>(cfg_workers["AsyncLogger"]);
d.ActionManagementWorker = d.TaskScheduler->template CreateWorker<ActionManagementWorkerType>(cfg_workers["ActionManager"]);
d.AlterImuWorker = d.TaskScheduler->template CreateWorker<AlterImuWorkerType>([&d](SchedulerType::Ptr scheduler) {
RealNumber roll = d.ImuAlterPtr->GetRoll();
RealNumber pitch = d.ImuAlterPtr->GetPitch();
RealNumber yaw = d.ImuAlterPtr->GetYaw();
Vec3 euler_angles = Vec3({ roll, pitch, yaw });
scheduler->template SetData<"AlterAngleValue">(euler_angles);
});
//创建主任务列表,并添加worker
d.TaskScheduler->CreateTaskList("MainTask", 1, true);
d.TaskScheduler->AddWorkers("MainTask",
{
d.ImuWorker,
d.AlterImuWorker,
d.MotorWorker
});
//创建推理任务列表,并添加worker,设置推理任务频率
d.DanceNetInferWorker = d.TaskScheduler->template CreateWorker<BeyondMimicUnitreeInferWorkerType>(cfg_workers["DanceNet1"], cfg_workers["DanceNet1"], JOINT_ID_MAP);
d.TaskScheduler->CreateTaskList("DanceInferTask", cfg_root["Scheduler"]["InferTask"]["PolicyFrequency"]);
d.TaskScheduler->AddWorkers("DanceInferTask",
{
d.DanceNetInferWorker,
d.ActionManagementWorker//,
//d.Logger
});
//创建走路的推理任务列表,并添加worker,设置推理任务频率
d.WalkNetInferWorker = d.TaskScheduler->template CreateWorker<UnitreeRlLabVelocityInferWorkerType>(cfg_workers["WalkNet1"], cfg_workers["MotorControl"]);
d.WalkCmdWorker = d.TaskScheduler->template CreateWorker<CmdWorkerType>(cfg_workers["WalkCmd"]);
d.TaskScheduler->CreateTaskList("InferWalkTask", cfg_root["Scheduler"]["InferTask"]["PolicyFrequency"]);
d.TaskScheduler->AddWorkers("InferWalkTask",
{
d.WalkCmdWorker,
d.WalkNetInferWorker,
d.ActionManagementWorker,
d.Logger
});
//创建复位任务列表,并添加worker,设置复位任务频率为主任务频率的1/10
d.MotorResetWorker = d.TaskScheduler->template CreateWorker<MotorResetWorkerType>(cfg_workers["MotorControl"], cfg_workers["ResetPosition"]);
d.TaskScheduler->CreateTaskList("ResetTask", 10);
d.TaskScheduler->AddWorker("ResetTask", d.MotorResetWorker);
//开始调度器
d.TaskScheduler->Start();
}
void FinishFunc(UserData& d)
{
std::cout << "Finishing user functions..." << std::endl;
std::cout << "Goodbye!" << std::endl;
}
void StateWaitingFunc(const bitbot::KernelInterface& kernel,
bitbot::ExtraData& extra_data, UserData& d)
{
//空闲等待状态,重置目标位置防止突变
d.MotorWorker->SetCurrentPositionAsTargetPosition();
//调度器进行一次调度
d.TaskScheduler->SpinOnce();
}
void StateSystemTestFunc(const bitbot::KernelInterface& kernel,
bitbot::ExtraData& extra_data, UserData& user_data)
{
//bitbot测试状态为空,用户可自行添加
}
void StatePolicyRunFunc(const bitbot::KernelInterface& kernel,
bitbot::ExtraData& extra_data, UserData& d)
{
d.TaskScheduler->SpinOnce(); //运行状态(控制主状态),进行一次调度
};
void StatePolicyDanceFunc(const bitbot::KernelInterface& kernel,
bitbot::ExtraData& extra_data, UserData& d)
{
d.TaskScheduler->SpinOnce(); //运行状态(跳舞主状态),进行一次调度
}
void StateInitPoseFunc(const bitbot::KernelInterface& kernel,
bitbot::ExtraData& extra_data, UserData& d)
{
d.TaskScheduler->SpinOnce(); //复位状态,进行一次调度
}