修正遥控器映射
This commit is contained in:
parent
abfa985bd1
commit
5f7c7042bf
@ -13,24 +13,22 @@ JoystickInput::JoystickInput() : Node("joysick_input_node") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JoystickInput::joy_callback(sensor_msgs::msg::Joy::SharedPtr msg) {
|
void JoystickInput::joy_callback(sensor_msgs::msg::Joy::SharedPtr msg) {
|
||||||
if (msg->buttons[1] && msg->buttons[4]) {
|
if (msg->buttons[0]) {
|
||||||
inputs_.command = 1; // LB + B
|
inputs_.command = 1; // BACK
|
||||||
} else if (msg->buttons[0] && msg->buttons[4]) {
|
} else if (msg->buttons[1]) {
|
||||||
inputs_.command = 2; // LB + A
|
inputs_.command = 2; // RB
|
||||||
} else if (msg->buttons[2] && msg->buttons[4]) {
|
} else if (msg->buttons[3]) {
|
||||||
inputs_.command = 3; // LB + X
|
inputs_.command = 3; // LB
|
||||||
} else if (msg->buttons[3] && msg->buttons[4]) {
|
} else if (msg->buttons[4]) {
|
||||||
inputs_.command = 4; // LB + Y
|
inputs_.command = 4; // Y
|
||||||
} else if (msg->axes[2] != 1 && msg->buttons[1]) {
|
} else if (msg->buttons[6]) {
|
||||||
inputs_.command = 5; // LT + B
|
inputs_.command = 5; // X
|
||||||
} else if (msg->axes[2] != 1 && msg->buttons[0]) {
|
|
||||||
inputs_.command = 6; // LT + A
|
|
||||||
} else if (msg->axes[2] != 1 && msg->buttons[3]) {
|
|
||||||
inputs_.command = 7; // LT + X
|
|
||||||
} else if (msg->axes[2] != 1 && msg->buttons[4]) {
|
|
||||||
inputs_.command = 8; // LT + Y
|
|
||||||
} else if (msg->buttons[7]) {
|
} else if (msg->buttons[7]) {
|
||||||
inputs_.command = 9; // START
|
inputs_.command = 6; // B
|
||||||
|
} else if (msg->buttons[8]) {
|
||||||
|
inputs_.command = 7; // A
|
||||||
|
} else if (msg->buttons[9]) {
|
||||||
|
inputs_.command = 8;
|
||||||
} else {
|
} else {
|
||||||
inputs_.command = 0;
|
inputs_.command = 0;
|
||||||
inputs_.lx = -msg->axes[0];
|
inputs_.lx = -msg->axes[0];
|
||||||
|
@ -22,6 +22,7 @@ include_directories(
|
|||||||
add_executable(mdog_simple_controller
|
add_executable(mdog_simple_controller
|
||||||
src/mdog_simple_controller.cpp
|
src/mdog_simple_controller.cpp
|
||||||
src/FSM/state_safe.cpp
|
src/FSM/state_safe.cpp
|
||||||
|
src/FSM/state_stand.cpp
|
||||||
src/FSM/state_zero.cpp
|
src/FSM/state_zero.cpp
|
||||||
src/FSM/state_walk.cpp
|
src/FSM/state_walk.cpp
|
||||||
src/FSM/state_balance.cpp
|
src/FSM/state_balance.cpp
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <array>
|
||||||
|
#include "mdog_simple_controller/FSM/fsm_state.hpp"
|
||||||
|
|
||||||
|
namespace mdog_simple_controller {
|
||||||
|
|
||||||
|
class StateStand : public FSMState {
|
||||||
|
public:
|
||||||
|
void enter(MdogSimpleController*) override;
|
||||||
|
void run(MdogSimpleController*) override;
|
||||||
|
void exit(MdogSimpleController*) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool inited = false;
|
||||||
|
|
||||||
|
std::array<std::array<double, 3>, 4> stand_pos;
|
||||||
|
|
||||||
|
std::array<std::array<double, 3>, 4> start_pos;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -23,7 +23,12 @@ constexpr float JOINT_RATIO[4][3] = {
|
|||||||
// feedback → real
|
// feedback → real
|
||||||
void feedback_to_real(const MdogControllerData& src, MdogControllerData& dst);
|
void feedback_to_real(const MdogControllerData& src, MdogControllerData& dst);
|
||||||
|
|
||||||
|
// real → feedback
|
||||||
|
void real_to_feedback(const MdogControllerData& src, MdogControllerData& dst);
|
||||||
|
|
||||||
// real cmd → 输出 cmd
|
// real cmd → 输出 cmd
|
||||||
void realcmd_to_cmd(const MdogControllerData& src, MdogControllerData& dst);
|
void realcmd_to_cmd(const MdogControllerData& src, MdogControllerData& dst);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace mdog_simple_controller
|
} // namespace mdog_simple_controller
|
@ -7,6 +7,7 @@
|
|||||||
#include "sensor_msgs/msg/joint_state.hpp"
|
#include "sensor_msgs/msg/joint_state.hpp"
|
||||||
#include "geometry_msgs/msg/vector3.hpp"
|
#include "geometry_msgs/msg/vector3.hpp"
|
||||||
#include "mdog_simple_controller/FSM/state_safe.hpp"
|
#include "mdog_simple_controller/FSM/state_safe.hpp"
|
||||||
|
#include "mdog_simple_controller/FSM/state_stand.hpp"
|
||||||
#include "mdog_simple_controller/FSM/state_zero.hpp"
|
#include "mdog_simple_controller/FSM/state_zero.hpp"
|
||||||
#include "mdog_simple_controller/FSM/state_walk.hpp"
|
#include "mdog_simple_controller/FSM/state_walk.hpp"
|
||||||
#include "mdog_simple_controller/FSM/state_balance.hpp"
|
#include "mdog_simple_controller/FSM/state_balance.hpp"
|
||||||
@ -75,6 +76,7 @@ private:
|
|||||||
|
|
||||||
FSMState* current_state_{nullptr};
|
FSMState* current_state_{nullptr};
|
||||||
StateSafe state_safe_;
|
StateSafe state_safe_;
|
||||||
|
StateStand state_stand_;
|
||||||
StateZero state_zero_;
|
StateZero state_zero_;
|
||||||
StateWalk state_walk_;
|
StateWalk state_walk_;
|
||||||
StateBalance state_balance_;
|
StateBalance state_balance_;
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
#include "mdog_simple_controller/FSM/state_stand.hpp"
|
||||||
|
#include "mdog_simple_controller/mdog_simple_controller.hpp"
|
||||||
|
|
||||||
|
namespace mdog_simple_controller {
|
||||||
|
|
||||||
|
void StateStand::enter(MdogSimpleController* ctrl) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateStand::run(MdogSimpleController* ctrl) {
|
||||||
|
// SAFE状态下的控制逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateStand::exit(MdogSimpleController* ctrl) {
|
||||||
|
// 离开SAFE状态时的清理
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -40,24 +40,11 @@ void StateWalk::run(MdogSimpleController* ctrl) {
|
|||||||
double dt = (now - last_time).seconds();
|
double dt = (now - last_time).seconds();
|
||||||
last_time = now;
|
last_time = now;
|
||||||
|
|
||||||
static std::array<std::array<double, 3>, 4> start_theta; // 回位起点
|
|
||||||
static bool start_theta_set = false;
|
|
||||||
|
|
||||||
if (!homing_done) {
|
if (!homing_done) {
|
||||||
if (!start_theta_set) {
|
|
||||||
// 只在回位开始时记录一次
|
|
||||||
for (int leg = 0; leg < 4; ++leg) {
|
|
||||||
for (int j = 0; j < 3; ++j) {
|
|
||||||
start_theta[leg][j] = ctrl->data_.feedback_real[leg].pos[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
start_theta_set = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
homing_time += dt;
|
homing_time += dt;
|
||||||
double alpha = std::min(homing_time / homing_duration, 1.0); // 插值系数
|
double alpha = std::min(homing_time / homing_duration, 1.0); // 插值系数
|
||||||
|
|
||||||
std::array<double, 3> home_pos = {0.0, 0.0, -0.4};
|
std::array<double, 3> home_pos = {0.0, 0.0, -0.35};
|
||||||
const auto& link = kinematics::get_leg_link_length();
|
const auto& link = kinematics::get_leg_link_length();
|
||||||
const auto& hip_signs = kinematics::get_hip_signs();
|
const auto& hip_signs = kinematics::get_hip_signs();
|
||||||
|
|
||||||
@ -67,9 +54,10 @@ void StateWalk::run(MdogSimpleController* ctrl) {
|
|||||||
for (int leg = 0; leg < 4; ++leg) {
|
for (int leg = 0; leg < 4; ++leg) {
|
||||||
std::array<double, 3> theta;
|
std::array<double, 3> theta;
|
||||||
for (int j = 0; j < 3; ++j) {
|
for (int j = 0; j < 3; ++j) {
|
||||||
// 插值到目标关节角度
|
// 每次都用当前位置做起点
|
||||||
double tgt = target_theta[j] * hip_signs[leg];
|
double start = ctrl->data_.feedback_real[leg].pos[j];
|
||||||
theta[j] = (1 - alpha) * start_theta[leg][j] + alpha * tgt;
|
double tgt = (j == 0) ? (target_theta[j] * hip_signs[leg]) : target_theta[j];
|
||||||
|
theta[j] = (1 - alpha) * start + alpha * tgt;
|
||||||
ctrl->data_.command_real[leg].pos_des[j] = theta[j];
|
ctrl->data_.command_real[leg].pos_des[j] = theta[j];
|
||||||
ctrl->data_.command_real[leg].speed_des[j] = 0;
|
ctrl->data_.command_real[leg].speed_des[j] = 0;
|
||||||
ctrl->data_.command_real[leg].torque_des[j] = 0;
|
ctrl->data_.command_real[leg].torque_des[j] = 0;
|
||||||
@ -81,16 +69,15 @@ void StateWalk::run(MdogSimpleController* ctrl) {
|
|||||||
|
|
||||||
if (homing_time >= homing_duration) {
|
if (homing_time >= homing_duration) {
|
||||||
homing_done = true;
|
homing_done = true;
|
||||||
start_theta_set = false; // 下次回位可重新记录
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ...existing code...
|
// 以下内容必须在 run 函数体内
|
||||||
std::vector<std::array<double, 3>> control_points = {
|
std::vector<std::array<double, 3>> control_points = {
|
||||||
{0.15, 0.0, -0.40}, // 起点
|
{0.25, 0.0, -0.35}, // 起点
|
||||||
{0.10, 0.0, -0.2}, // 抬腿中点
|
{0.1, 0.0, -0.25}, // 抬腿中点
|
||||||
{-0.15, 0.0, -0.40}, // 落点
|
{-0.05, 0.0, -0.35}, // 落点
|
||||||
};
|
};
|
||||||
const auto& p0 = control_points.front();
|
const auto& p0 = control_points.front();
|
||||||
const auto& p1 = control_points.back();
|
const auto& p1 = control_points.back();
|
||||||
@ -133,8 +120,6 @@ void StateWalk::run(MdogSimpleController* ctrl) {
|
|||||||
realcmd_to_cmd(ctrl->data_, ctrl->data_);
|
realcmd_to_cmd(ctrl->data_, ctrl->data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ...existing code...
|
|
||||||
|
|
||||||
void StateWalk::exit(MdogSimpleController* ctrl) {
|
void StateWalk::exit(MdogSimpleController* ctrl) {
|
||||||
// 可选:状态退出时清理
|
// 可选:状态退出时清理
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,20 @@ void feedback_to_real(const MdogControllerData& src, MdogControllerData& dst) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// real -> feedback
|
||||||
|
void real_to_feedback(const MdogControllerData& src, MdogControllerData& dst) {
|
||||||
|
for (int leg = 0; leg < 4; ++leg) {
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
// 位置:乘以减速比,加offset
|
||||||
|
dst.feedback[leg].pos[j] = src.feedback_real[leg].pos[j] * JOINT_RATIO[leg][j] + JOINT_OFFSET[leg][j];
|
||||||
|
// 速度:乘以减速比
|
||||||
|
dst.feedback[leg].speed[j] = src.feedback_real[leg].speed[j] * JOINT_RATIO[leg][j];
|
||||||
|
// 力矩:除以减速比
|
||||||
|
dst.feedback[leg].torque[j] = src.feedback_real[leg].torque[j] / JOINT_RATIO[leg][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// real cmd → 输出 cmd
|
// real cmd → 输出 cmd
|
||||||
void realcmd_to_cmd(const MdogControllerData& src, MdogControllerData& dst) {
|
void realcmd_to_cmd(const MdogControllerData& src, MdogControllerData& dst) {
|
||||||
for (int leg = 0; leg < 4; ++leg) {
|
for (int leg = 0; leg < 4; ++leg) {
|
||||||
@ -33,4 +47,9 @@ void realcmd_to_cmd(const MdogControllerData& src, MdogControllerData& dst) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 插补函数
|
||||||
|
double interpolate(double start, double end, double alpha) {
|
||||||
|
return (1 - alpha) * start + alpha * end;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mdog_simple_controller
|
} // namespace mdog_simple_controller
|
@ -48,7 +48,7 @@ void MdogSimpleController::input_callback(const control_input_msgs::msg::Inputs:
|
|||||||
input_cmd_.voltage.vx = msg->lx;
|
input_cmd_.voltage.vx = msg->lx;
|
||||||
input_cmd_.voltage.vy = msg->ly;
|
input_cmd_.voltage.vy = msg->ly;
|
||||||
input_cmd_.voltage.wz = msg->rx;
|
input_cmd_.voltage.wz = msg->rx;
|
||||||
input_cmd_.hight = 0.35;
|
// input_cmd_.hight = 0.35;
|
||||||
input_cmd_.status = msg->command;
|
input_cmd_.status = msg->command;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,12 +75,18 @@ void MdogSimpleController::control_loop() {
|
|||||||
if (if_no_hardware_) {
|
if (if_no_hardware_) {
|
||||||
for (int leg = 0; leg < 4; ++leg) {
|
for (int leg = 0; leg < 4; ++leg) {
|
||||||
for (int j = 0; j < 3; ++j) {
|
for (int j = 0; j < 3; ++j) {
|
||||||
data_.feedback[leg].torque[j] = data_.command[leg].torque_des[j];
|
// data_.feedback[leg].torque[j] = data_.command[leg].torque_des[j];
|
||||||
data_.feedback[leg].speed[j] = data_.command[leg].speed_des[j];
|
// data_.feedback[leg].speed[j] = data_.command[leg].speed_des[j];
|
||||||
data_.feedback[leg].pos[j] = data_.command[leg].pos_des[j];
|
// data_.feedback[leg].pos[j] = data_.command[leg].pos_des[j];
|
||||||
|
data_.feedback_real[leg].torque[j] = data_.command_real[leg].torque_des[j];
|
||||||
|
data_.feedback_real[leg].speed[j] = data_.command_real[leg].speed_des[j];
|
||||||
|
data_.feedback_real[leg].pos[j] = data_.command_real[leg].pos_des[j];
|
||||||
|
data_.feedback[leg].torque[j] = data_.command_real[leg].torque_des[j];
|
||||||
|
data_.feedback[leg].speed[j] = data_.command_real[leg].speed_des[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
feedback_to_real(data_, data_);
|
// feedback_to_real(data_, data_);
|
||||||
|
// real_to_feedback(data_, data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_msgs::msg::LegCmd msg;
|
rc_msgs::msg::LegCmd msg;
|
||||||
|
Loading…
Reference in New Issue
Block a user