基于话题控制的go,但是话题控制频率最高300
This commit is contained in:
parent
bca5ab3a3b
commit
7d2230b092
66
.vscode/settings.json
vendored
66
.vscode/settings.json
vendored
@ -1,69 +1,5 @@
|
|||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"cctype": "cpp",
|
"functional": "cpp"
|
||||||
"clocale": "cpp",
|
|
||||||
"cmath": "cpp",
|
|
||||||
"cstdarg": "cpp",
|
|
||||||
"cstddef": "cpp",
|
|
||||||
"cstdio": "cpp",
|
|
||||||
"cstdlib": "cpp",
|
|
||||||
"cstring": "cpp",
|
|
||||||
"ctime": "cpp",
|
|
||||||
"cwchar": "cpp",
|
|
||||||
"cwctype": "cpp",
|
|
||||||
"array": "cpp",
|
|
||||||
"atomic": "cpp",
|
|
||||||
"bit": "cpp",
|
|
||||||
"bitset": "cpp",
|
|
||||||
"chrono": "cpp",
|
|
||||||
"compare": "cpp",
|
|
||||||
"complex": "cpp",
|
|
||||||
"concepts": "cpp",
|
|
||||||
"condition_variable": "cpp",
|
|
||||||
"cstdint": "cpp",
|
|
||||||
"deque": "cpp",
|
|
||||||
"forward_list": "cpp",
|
|
||||||
"list": "cpp",
|
|
||||||
"map": "cpp",
|
|
||||||
"set": "cpp",
|
|
||||||
"string": "cpp",
|
|
||||||
"unordered_map": "cpp",
|
|
||||||
"unordered_set": "cpp",
|
|
||||||
"vector": "cpp",
|
|
||||||
"exception": "cpp",
|
|
||||||
"algorithm": "cpp",
|
|
||||||
"functional": "cpp",
|
|
||||||
"iterator": "cpp",
|
|
||||||
"memory": "cpp",
|
|
||||||
"memory_resource": "cpp",
|
|
||||||
"numeric": "cpp",
|
|
||||||
"optional": "cpp",
|
|
||||||
"random": "cpp",
|
|
||||||
"ratio": "cpp",
|
|
||||||
"string_view": "cpp",
|
|
||||||
"system_error": "cpp",
|
|
||||||
"tuple": "cpp",
|
|
||||||
"type_traits": "cpp",
|
|
||||||
"utility": "cpp",
|
|
||||||
"fstream": "cpp",
|
|
||||||
"initializer_list": "cpp",
|
|
||||||
"iomanip": "cpp",
|
|
||||||
"iosfwd": "cpp",
|
|
||||||
"iostream": "cpp",
|
|
||||||
"istream": "cpp",
|
|
||||||
"limits": "cpp",
|
|
||||||
"mutex": "cpp",
|
|
||||||
"new": "cpp",
|
|
||||||
"numbers": "cpp",
|
|
||||||
"ostream": "cpp",
|
|
||||||
"semaphore": "cpp",
|
|
||||||
"sstream": "cpp",
|
|
||||||
"stdexcept": "cpp",
|
|
||||||
"stop_token": "cpp",
|
|
||||||
"streambuf": "cpp",
|
|
||||||
"thread": "cpp",
|
|
||||||
"cinttypes": "cpp",
|
|
||||||
"typeindex": "cpp",
|
|
||||||
"typeinfo": "cpp"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
0
src/controllers/trot.py
Normal file
0
src/controllers/trot.py
Normal file
@ -11,23 +11,10 @@ find_package(rclcpp REQUIRED)
|
|||||||
find_package(rclcpp_components REQUIRED)
|
find_package(rclcpp_components REQUIRED)
|
||||||
find_package(std_msgs REQUIRED)
|
find_package(std_msgs REQUIRED)
|
||||||
find_package(serial REQUIRED)
|
find_package(serial REQUIRED)
|
||||||
find_package(rosidl_default_generators REQUIRED) # 添加消息生成依赖
|
find_package(rc_msgs REQUIRED)
|
||||||
|
|
||||||
# 添加头文件目录
|
# 添加头文件目录
|
||||||
include_directories(include)
|
include_directories(include)
|
||||||
|
|
||||||
# 添加消息文件
|
|
||||||
set(msg_files
|
|
||||||
msgs/GoMotorFdb.msg
|
|
||||||
msgs/GoMotorCmd.msg
|
|
||||||
)
|
|
||||||
|
|
||||||
# 生成消息
|
|
||||||
rosidl_generate_interfaces(${PROJECT_NAME}
|
|
||||||
${msg_files}
|
|
||||||
DEPENDENCIES std_msgs
|
|
||||||
)
|
|
||||||
|
|
||||||
# 添加源文件并生成共享库
|
# 添加源文件并生成共享库
|
||||||
add_library(${PROJECT_NAME}_lib SHARED # 修改目标名称,避免冲突
|
add_library(${PROJECT_NAME}_lib SHARED # 修改目标名称,避免冲突
|
||||||
src/unitree_leg_serial.cpp
|
src/unitree_leg_serial.cpp
|
||||||
@ -40,6 +27,7 @@ ament_target_dependencies(${PROJECT_NAME}_lib
|
|||||||
rclcpp_components
|
rclcpp_components
|
||||||
std_msgs
|
std_msgs
|
||||||
serial
|
serial
|
||||||
|
rc_msgs
|
||||||
)
|
)
|
||||||
|
|
||||||
# 注册组件
|
# 注册组件
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include "unitree_leg_serial_driver/crc_ccitt.hpp"
|
#include "unitree_leg_serial_driver/crc_ccitt.hpp"
|
||||||
#include "unitree_leg_serial_driver/gom_protocol.hpp"
|
#include "unitree_leg_serial_driver/gom_protocol.hpp"
|
||||||
|
#include "rc_msgs/msg/go_motor_cmd.hpp"
|
||||||
|
#include "rc_msgs/msg/go_motor_fdb.hpp"
|
||||||
namespace unitree_leg_serial
|
namespace unitree_leg_serial
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -25,6 +26,15 @@ private:
|
|||||||
void motor_cmd_reset();
|
void motor_cmd_reset();
|
||||||
bool open_serial_port();
|
bool open_serial_port();
|
||||||
void close_serial_port();
|
void close_serial_port();
|
||||||
|
void motor_cmd_callback(const rc_msgs::msg::GoMotorCmd::SharedPtr msg);
|
||||||
|
|
||||||
|
int send_count_;
|
||||||
|
int recv_count_;
|
||||||
|
rclcpp::Time last_freq_time_;
|
||||||
|
|
||||||
|
rclcpp::Publisher<rc_msgs::msg::GoMotorFdb>::SharedPtr motor_fdb_pub_;
|
||||||
|
rclcpp::Subscription<rc_msgs::msg::GoMotorCmd>::SharedPtr motor_cmd_sub_;
|
||||||
|
|
||||||
|
|
||||||
std::unique_ptr<serial::Serial> serial_port_;
|
std::unique_ptr<serial::Serial> serial_port_;
|
||||||
rclcpp::TimerBase::SharedPtr timer_;
|
rclcpp::TimerBase::SharedPtr timer_;
|
||||||
|
@ -9,17 +9,18 @@
|
|||||||
|
|
||||||
<!-- Build dependencies -->
|
<!-- Build dependencies -->
|
||||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||||
<buildtool_depend>rosidl_default_generators</buildtool_depend>
|
|
||||||
<build_depend>rclcpp</build_depend>
|
<build_depend>rclcpp</build_depend>
|
||||||
<build_depend>rclcpp_components</build_depend>
|
<build_depend>rclcpp_components</build_depend>
|
||||||
<build_depend>std_msgs</build_depend>
|
<build_depend>std_msgs</build_depend>
|
||||||
<build_depend>serial</build_depend>
|
<build_depend>serial</build_depend>
|
||||||
|
<build_depend>rc_msgs</build_depend>
|
||||||
|
|
||||||
<!-- Execution dependencies -->
|
<!-- Execution dependencies -->
|
||||||
<exec_depend>rclcpp</exec_depend>
|
<exec_depend>rclcpp</exec_depend>
|
||||||
<exec_depend>rclcpp_components</exec_depend>
|
<exec_depend>rclcpp_components</exec_depend>
|
||||||
<exec_depend>std_msgs</exec_depend>
|
<exec_depend>std_msgs</exec_depend>
|
||||||
<exec_depend>serial</exec_depend>
|
<exec_depend>serial</exec_depend>
|
||||||
|
<exec_depend>rc_msgs</exec_depend>
|
||||||
|
|
||||||
<!-- Test dependencies -->
|
<!-- Test dependencies -->
|
||||||
<test_depend>ament_lint_auto</test_depend>
|
<test_depend>ament_lint_auto</test_depend>
|
||||||
|
@ -1,15 +1,27 @@
|
|||||||
#include "unitree_leg_serial_driver/unitree_leg_serial.hpp"
|
#include "unitree_leg_serial_driver/unitree_leg_serial.hpp"
|
||||||
#include "rclcpp_components/register_node_macro.hpp"
|
#include "rclcpp_components/register_node_macro.hpp"
|
||||||
|
#include "rc_msgs/msg/go_motor_cmd.hpp"
|
||||||
|
#include "rc_msgs/msg/go_motor_fdb.hpp"
|
||||||
namespace unitree_leg_serial
|
namespace unitree_leg_serial
|
||||||
{
|
{
|
||||||
|
|
||||||
UnitreeLegSerial::UnitreeLegSerial(const rclcpp::NodeOptions &options)
|
UnitreeLegSerial::UnitreeLegSerial(const rclcpp::NodeOptions &options)
|
||||||
: Node("unitree_leg_serial", options)
|
: Node("unitree_leg_serial", options)
|
||||||
{
|
{
|
||||||
serial_port_name_ = "/dev/ttyACM3";
|
serial_port_name_ = "/dev/ttyACM0";
|
||||||
baud_rate_ = 4000000;
|
baud_rate_ = 4000000;
|
||||||
|
|
||||||
|
send_count_ = 0;
|
||||||
|
recv_count_ = 0;
|
||||||
|
last_freq_time_ = this->now();
|
||||||
|
|
||||||
|
// 发布器
|
||||||
|
motor_fdb_pub_ = this->create_publisher<rc_msgs::msg::GoMotorFdb>("motor_fdb", 10);
|
||||||
|
// 订阅器
|
||||||
|
motor_cmd_sub_ = this->create_subscription<rc_msgs::msg::GoMotorCmd>(
|
||||||
|
"motor_cmd", 10,
|
||||||
|
std::bind(&UnitreeLegSerial::motor_cmd_callback, this, std::placeholders::_1));
|
||||||
|
|
||||||
if (!open_serial_port()) {
|
if (!open_serial_port()) {
|
||||||
RCLCPP_ERROR(this->get_logger(), "Failed to open serial port: %s", serial_port_name_.c_str());
|
RCLCPP_ERROR(this->get_logger(), "Failed to open serial port: %s", serial_port_name_.c_str());
|
||||||
return;
|
return;
|
||||||
@ -34,6 +46,18 @@ UnitreeLegSerial::~UnitreeLegSerial()
|
|||||||
close_serial_port();
|
close_serial_port();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UnitreeLegSerial::motor_cmd_callback(const rc_msgs::msg::GoMotorCmd::SharedPtr msg)
|
||||||
|
{
|
||||||
|
// 填充motor_cmd_结构体
|
||||||
|
motor_cmd_.T = msg->torque_des;
|
||||||
|
motor_cmd_.W = msg->speed_des;
|
||||||
|
motor_cmd_.Pos = msg->pos_des;
|
||||||
|
motor_cmd_.K_P = msg->kp;
|
||||||
|
motor_cmd_.K_W = msg->kd;
|
||||||
|
status_flag_ = CONTROLED;
|
||||||
|
tick_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool UnitreeLegSerial::open_serial_port()
|
bool UnitreeLegSerial::open_serial_port()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@ -64,6 +88,16 @@ void UnitreeLegSerial::motor_update()
|
|||||||
motor_cmd_reset();
|
motor_cmd_reset();
|
||||||
}
|
}
|
||||||
send_motor_data(motor_cmd_);
|
send_motor_data(motor_cmd_);
|
||||||
|
send_count_++;
|
||||||
|
|
||||||
|
// 每秒打印一次频率
|
||||||
|
auto now = this->now();
|
||||||
|
if ((now - last_freq_time_).seconds() >= 1.0) {
|
||||||
|
RCLCPP_INFO(this->get_logger(), "发送频率: %d Hz, 接收频率: %d Hz", send_count_, recv_count_);
|
||||||
|
send_count_ = 0;
|
||||||
|
recv_count_ = 0;
|
||||||
|
last_freq_time_ = now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnitreeLegSerial::motor_cmd_reset()
|
void UnitreeLegSerial::motor_cmd_reset()
|
||||||
@ -162,6 +196,13 @@ void UnitreeLegSerial::receive_data()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (motor_fbk_.correct) {
|
if (motor_fbk_.correct) {
|
||||||
|
// 发布反馈消息
|
||||||
|
rc_msgs::msg::GoMotorFdb msg;
|
||||||
|
msg.torque = motor_fbk_.T;
|
||||||
|
msg.speed = motor_fbk_.W;
|
||||||
|
msg.pos = motor_fbk_.Pos;
|
||||||
|
motor_fdb_pub_->publish(msg);
|
||||||
|
recv_count_++;
|
||||||
RCLCPP_INFO_THROTTLE(this->get_logger(), *this->get_clock(), 1000, "Motor ID: %d, Position: %f", motor_fbk_.motor_id, motor_fbk_.Pos);
|
RCLCPP_INFO_THROTTLE(this->get_logger(), *this->get_clock(), 1000, "Motor ID: %d, Position: %f", motor_fbk_.motor_id, motor_fbk_.Pos);
|
||||||
}
|
}
|
||||||
std::memmove(buffer.data(), buffer.data() + packet_size, buffer_offset - packet_size);
|
std::memmove(buffer.data(), buffer.data() + packet_size, buffer_offset - packet_size);
|
||||||
|
51
src/rc_msgs/.gitignore
vendored
Normal file
51
src/rc_msgs/.gitignore
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
devel/
|
||||||
|
logs/
|
||||||
|
build/
|
||||||
|
bin/
|
||||||
|
lib/
|
||||||
|
msg_gen/
|
||||||
|
srv_gen/
|
||||||
|
msg/*Action.msg
|
||||||
|
msg/*ActionFeedback.msg
|
||||||
|
msg/*ActionGoal.msg
|
||||||
|
msg/*ActionResult.msg
|
||||||
|
msg/*Feedback.msg
|
||||||
|
msg/*Goal.msg
|
||||||
|
msg/*Result.msg
|
||||||
|
msg/_*.py
|
||||||
|
build_isolated/
|
||||||
|
devel_isolated/
|
||||||
|
|
||||||
|
# Generated by dynamic reconfigure
|
||||||
|
*.cfgc
|
||||||
|
/cfg/cpp/
|
||||||
|
/cfg/*.py
|
||||||
|
|
||||||
|
# Ignore generated docs
|
||||||
|
*.dox
|
||||||
|
*.wikidoc
|
||||||
|
|
||||||
|
# eclipse stuff
|
||||||
|
.project
|
||||||
|
.cproject
|
||||||
|
|
||||||
|
# qcreator stuff
|
||||||
|
CMakeLists.txt.user
|
||||||
|
|
||||||
|
srv/_*.py
|
||||||
|
*.pcd
|
||||||
|
*.pyc
|
||||||
|
qtcreator-*
|
||||||
|
*.user
|
||||||
|
|
||||||
|
/planning/cfg
|
||||||
|
/planning/docs
|
||||||
|
/planning/src
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
# Emacs
|
||||||
|
.#*
|
||||||
|
|
||||||
|
# Catkin custom files
|
||||||
|
CATKIN_IGNORE
|
17
src/rc_msgs/CMakeLists.txt
Normal file
17
src/rc_msgs/CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(rc_msgs)
|
||||||
|
|
||||||
|
find_package(rosidl_default_generators REQUIRED)
|
||||||
|
rosidl_generate_interfaces(${PROJECT_NAME}
|
||||||
|
"msg/DataMCU.msg"
|
||||||
|
"msg/DataRef.msg"
|
||||||
|
"msg/DataAI.msg"
|
||||||
|
"msg/Ps2Data.msg"
|
||||||
|
"msg/GoalPose.msg"
|
||||||
|
"msg/DataNav.msg"
|
||||||
|
"msg/GoMotorCmd.msg"
|
||||||
|
"msg/GoMotorFdb.msg"
|
||||||
|
)
|
||||||
|
|
||||||
|
ament_package()
|
||||||
|
|
21
src/rc_msgs/LICENSE
Normal file
21
src/rc_msgs/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 zucheng Lv
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
6
src/rc_msgs/README.md
Normal file
6
src/rc_msgs/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# rc_msg
|
||||||
|
Some ROS 2 custom messages for Robocon
|
||||||
|
|
||||||
|
Usage
|
||||||
|
Modify or add files in the /msg directory as needed
|
||||||
|
colcon build
|
7
src/rc_msgs/msg/DataAI.msg
Normal file
7
src/rc_msgs/msg/DataAI.msg
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
float32 yaw
|
||||||
|
float32 pit
|
||||||
|
float32 rol
|
||||||
|
float32 vx
|
||||||
|
float32 vy
|
||||||
|
float32 wz
|
||||||
|
uint8 notice
|
8
src/rc_msgs/msg/DataMCU.msg
Normal file
8
src/rc_msgs/msg/DataMCU.msg
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
float32 q0
|
||||||
|
float32 q1
|
||||||
|
float32 q2
|
||||||
|
float32 q3
|
||||||
|
float32 yaw
|
||||||
|
float32 pit
|
||||||
|
float32 rol
|
||||||
|
uint8 notice
|
5
src/rc_msgs/msg/DataNav.msg
Normal file
5
src/rc_msgs/msg/DataNav.msg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
bool reached
|
||||||
|
|
||||||
|
float32 x
|
||||||
|
float32 y
|
||||||
|
float32 yaw
|
3
src/rc_msgs/msg/DataRef.msg
Normal file
3
src/rc_msgs/msg/DataRef.msg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
uint16 remain_hp
|
||||||
|
uint8 game_progress
|
||||||
|
uint16 stage_remain_time
|
8
src/rc_msgs/msg/GoalPose.msg
Normal file
8
src/rc_msgs/msg/GoalPose.msg
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
float32 x
|
||||||
|
float32 y
|
||||||
|
float32 angle
|
||||||
|
|
||||||
|
float32 max_speed
|
||||||
|
float32 tolerance
|
||||||
|
|
||||||
|
bool rotor
|
20
src/rc_msgs/msg/Ps2Data.msg
Normal file
20
src/rc_msgs/msg/Ps2Data.msg
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# control input message
|
||||||
|
float32 lx
|
||||||
|
float32 ly
|
||||||
|
float32 rx
|
||||||
|
float32 ry
|
||||||
|
|
||||||
|
float32 up_down
|
||||||
|
float32 left_right
|
||||||
|
|
||||||
|
bool l1
|
||||||
|
bool l2
|
||||||
|
bool r1
|
||||||
|
bool r2
|
||||||
|
|
||||||
|
# 四种模式
|
||||||
|
uint8 mode # 0:手柄控制 1:键盘控制 2:自瞄 3:手动瞄准
|
||||||
|
|
||||||
|
bool select
|
||||||
|
bool start
|
||||||
|
|
16
src/rc_msgs/package.xml
Normal file
16
src/rc_msgs/package.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<package format="3">
|
||||||
|
<name>rc_msgs</name>
|
||||||
|
<version>0.0.1</version>
|
||||||
|
<description>Describe custom messages</description>
|
||||||
|
<maintainer email="1683502971@qq.com">biao</maintainer>
|
||||||
|
<license>MIT</license>
|
||||||
|
|
||||||
|
<buildtool_depend>rosidl_default_generators</buildtool_depend>
|
||||||
|
<exec_depend>rosidl_default_runtime</exec_depend>
|
||||||
|
<member_of_group>rosidl_interface_packages</member_of_group>
|
||||||
|
|
||||||
|
<export>
|
||||||
|
<build_type>ament_cmake</build_type>
|
||||||
|
</export>
|
||||||
|
</package>
|
Loading…
Reference in New Issue
Block a user