diff --git a/deploy/robot_ws/src/go2py_node/src/bridge.cpp b/deploy/robot_ws/src/go2py_node/src/bridge.cpp index 542e419..e2f51fe 100644 --- a/deploy/robot_ws/src/go2py_node/src/bridge.cpp +++ b/deploy/robot_ws/src/go2py_node/src/bridge.cpp @@ -2,6 +2,7 @@ #include "unitree_go/msg/imu_state.hpp" #include "unitree_go/msg/motor_state.hpp" #include "unitree_go/msg/go2py_low_cmd.hpp" +#include "unitree_go/msg/go2py_low_state.hpp" #include "unitree_go/msg/low_cmd.hpp" #include "unitree_go/msg/motor_cmd.hpp" @@ -34,6 +35,8 @@ class Custom: public rclcpp::Node pub_odom = this->create_publisher("/go2/odom", 1); pub_imu = this->create_publisher("/go2/imu", 1); pub_joint = this->create_publisher("/go2/joint_states", 1); + lowstate_puber = this->create_publisher("/go2/lowstate", 1); + sub_twist = this->create_subscription("/go2/twist_cmd", 1, std::bind(&Custom::twistCmdCallback, this, std::placeholders::_1)); nav2_twist = this->create_subscription("/go2/cmd_vel", 1, std::bind(&Custom::nav2TwistCmdCallback, this, std::placeholders::_1)); @@ -94,7 +97,10 @@ class Custom: public rclcpp::Node rclcpp::Subscription::SharedPtr joint_cmd_suber; // A struct to store the highlevel states for later use rclcpp::Publisher::SharedPtr lowcmd_puber; + rclcpp::Publisher::SharedPtr lowstate_puber; + unitree_go::msg::LowCmd lowcmd_msg; + unitree_go::msg::Go2pyLowState lowstate_msg; uint64_t last_lowcmd_stamp = 0; xRockerBtnDataStruct _keyData; @@ -109,25 +115,6 @@ class Custom: public rclcpp::Node lowcmd_msg.motor_cmd[i].kd = 0; lowcmd_msg.motor_cmd[i].tau = 0; } - // taken from unitree_ros servo.cpp example - for (int i = 0; i < 4; ++i) { - // lowcmd_msg.motor_cmd[i*3+0].mode = 0x0A; - lowcmd_msg.motor_cmd[i*3+0].kp = 70; - // lowcmd_msg.motor_cmd[i*3+0].dq = 0; - lowcmd_msg.motor_cmd[i*3+0].kd = 3; - lowcmd_msg.motor_cmd[i*3+0].tau = 0; - // lowcmd_msg.motor_cmd[i*3+1].mode = 0x0A; - lowcmd_msg.motor_cmd[i*3+1].kp = 180; - // lowcmd_msg.motor_cmd[i*3+1].dq = 0; - lowcmd_msg.motor_cmd[i*3+1].kd = 8; - lowcmd_msg.motor_cmd[i*3+1].tau = 0; - // lowcmd_msg.motor_cmd[i*3+2].mode = 0x0A; - lowcmd_msg.motor_cmd[i*3+2].kp = 300; - // lowcmd_msg.motor_cmd[i*3+2].dq = 0; - lowcmd_msg.motor_cmd[i*3+2].kd = 15; - lowcmd_msg.motor_cmd[i*3+2].tau = 0; - } - } struct { @@ -153,6 +140,22 @@ class Custom: public rclcpp::Node void Custom::lowstate_callback(unitree_go::msg::LowState::SharedPtr data) { + + for (int i = 0; i < 12; ++i) { + lowstate_msg.q[i] = data->motor_state[i].q; + lowstate_msg.dq[i] = data->motor_state[i].dq; + lowstate_msg.tau_est[i] = data->motor_state[i].tau_est; + } + for (int i = 0; i < 4; ++i) { + lowstate_msg.quat[i] = data->imu_state.quaternion[i]; + } + for (int i = 0; i < 3; ++i) { + lowstate_msg.accel[i] = data->imu_state.accelerometer[i]; + lowstate_msg.gyro[i] = data->imu_state.gyroscope[i]; + } + + lowstate_puber->publish(lowstate_msg); + // std::cout << data->tick << std::endl; sensor_msgs::msg::Imu imu; sensor_msgs::msg::JointState joint_state; @@ -334,6 +337,23 @@ void Custom::joint_cmd_callback(sensor_msgs::msg::JointState::SharedPtr data) { { for(int i=0; i<12; i++) { + // taken from unitree_ros servo.cpp example + // lowcmd_msg.motor_cmd[i*3+0].mode = 0x0A; + lowcmd_msg.motor_cmd[i*3+0].kp = 70; + // lowcmd_msg.motor_cmd[i*3+0].dq = 0; + lowcmd_msg.motor_cmd[i*3+0].kd = 3; + lowcmd_msg.motor_cmd[i*3+0].tau = 0; + // lowcmd_msg.motor_cmd[i*3+1].mode = 0x0A; + lowcmd_msg.motor_cmd[i*3+1].kp = 180; + // lowcmd_msg.motor_cmd[i*3+1].dq = 0; + lowcmd_msg.motor_cmd[i*3+1].kd = 8; + lowcmd_msg.motor_cmd[i*3+1].tau = 0; + // lowcmd_msg.motor_cmd[i*3+2].mode = 0x0A; + lowcmd_msg.motor_cmd[i*3+2].kp = 300; + // lowcmd_msg.motor_cmd[i*3+2].dq = 0; + lowcmd_msg.motor_cmd[i*3+2].kd = 15; + lowcmd_msg.motor_cmd[i*3+2].tau = 0; + lowcmd_msg.motor_cmd[i].q = data->position[i]; // Taregt angular(rad) // lowcmd_msg.motor_cmd[i].kp = data->kp[i]; // Poinstion(rad) control kp gain lowcmd_msg.motor_cmd[i].dq = data->velocity[i]; // Taregt angular velocity(rad/ss) diff --git a/deploy/robot_ws/src/unitree/unitree_go/CMakeLists.txt b/deploy/robot_ws/src/unitree/unitree_go/CMakeLists.txt index 9621ad6..060fc93 100755 --- a/deploy/robot_ws/src/unitree/unitree_go/CMakeLists.txt +++ b/deploy/robot_ws/src/unitree/unitree_go/CMakeLists.txt @@ -49,6 +49,7 @@ rosidl_generate_interfaces(${PROJECT_NAME} "msg/UwbSwitch.msg" "msg/WirelessController.msg" "msg/Go2pyLowCmd.msg" + "msg/Go2pyLowState.msg" DEPENDENCIES geometry_msgs ) diff --git a/deploy/robot_ws/src/unitree/unitree_go/msg/Go2pyLowState.msg b/deploy/robot_ws/src/unitree/unitree_go/msg/Go2pyLowState.msg new file mode 100644 index 0000000..44bfc10 --- /dev/null +++ b/deploy/robot_ws/src/unitree/unitree_go/msg/Go2pyLowState.msg @@ -0,0 +1,13 @@ +float32[12] q +float32[12] dq +float32[12] ddq +float32[12] tau_est +float32[12] tmp +float32[4] contact +float32[4] quat +float32[3] gyro +float32[3] accel +float32[3] rpy +uint8 imu_tmp +float32 voltage +float32 current \ No newline at end of file