#include #include #include #include #include #include #include #include using namespace std; struct TestOption { std::string name; int id; }; const vector option_list = { {"damp", 0}, {"balance_stand", 1}, {"stop_move", 2}, {"stand_down", 3}, {"recovery_stand", 4}, {"move", 5}, {"switch_gait", 6}, {"speed_level", 7}, {"hand_stand", 8}, {"auto_recovery_set", 9}, {"free_walk", 11}, {"classic_walk", 12}, {"fast_walk", 13}, {"euler", 14}, }; int ConvertToInt(const std::string &str) { try { std::stoi(str); return std::stoi(str); } catch (const std::invalid_argument &) { return -1; } catch (const std::out_of_range &) { return -1; } } class UserInterface { public: UserInterface() {}; ~UserInterface() {}; void terminalHandle() { std::string input; std::getline(std::cin, input); if (input.compare("list") == 0) { for (TestOption option : option_list) { std::cout << option.name << ", id: " << option.id << std::endl; } } for (TestOption option : option_list) { if (input.compare(option.name) == 0 || ConvertToInt(input) == option.id) { test_option_->id = option.id; test_option_->name = option.name; std::cout << "Test: " << test_option_->name << ", test_id: " << test_option_->id << std::endl; } } }; TestOption *test_option_; }; int main(int argc, char **argv) { if (argc < 2) { std::cout << "Usage: " << argv[0] << " networkInterface" << std::endl; exit(-1); } unitree::robot::ChannelFactory::Instance()->Init(0, argv[1]); TestOption test_option; test_option.id = 1; unitree::robot::b2::SportClient sport_client; sport_client.SetTimeout(25.0f); sport_client.Init(); UserInterface user_interface; user_interface.test_option_ = &test_option; std::cout << "Input \"list \" to list all test option ..." << std::endl; long res_count = 0; while (1) { auto time_start_trick = std::chrono::high_resolution_clock::now(); static const constexpr auto dt = std::chrono::microseconds(20000); // 50Hz user_interface.terminalHandle(); int res = 1; if (test_option.id == 0) { res = sport_client.Damp(); } else if (test_option.id == 1) { res = sport_client.BalanceStand(); } else if (test_option.id == 2) { res = sport_client.StopMove(); } else if (test_option.id == 3) { res = sport_client.StandDown(); } else if (test_option.id == 4) { res = sport_client.RecoveryStand(); } else if (test_option.id == 5) { res = sport_client.Move(0.0, 0.0, 0.5); } else if (test_option.id == 6) { res = sport_client.SwitchGait(0); } else if (test_option.id == 7) { res = sport_client.SpeedLevel(1); } else if (test_option.id == 8) { res = sport_client.HandStand(true); } else if (test_option.id == 9) { res = sport_client.AutoRecoverySet(true); } else if (test_option.id == 11) { res = sport_client.FreeWalk(); } else if (test_option.id == 12) { res = sport_client.ClassicWalk(true); } else if (test_option.id == 13) { res = sport_client.FastWalk(true); } else if (test_option.id == 14) { res = sport_client.Euler(0.0, 0.2, 0.0); } if (res < 0) { res_count += 1; std::cout << "Request error for: " << option_list[test_option.id].name << ", code: " << res << ", count: " << res_count << std::endl; } else { res_count = 0; std::cout << "Request successed: " << option_list[test_option.id].name << ", code: " << res << std::endl; } std::this_thread::sleep_until(time_start_trick + dt); } return 0; }