1、判断RTK信号质量和超时情况
2、修改档位和速度,适配新200底盘
This commit is contained in:
parent
698758baa7
commit
dea1c5c797
@ -216,11 +216,11 @@ private:
|
|||||||
// 接收PL消息的参数
|
// 接收PL消息的参数
|
||||||
double x = 0.0;
|
double x = 0.0;
|
||||||
double y = 0.0;
|
double y = 0.0;
|
||||||
int speed = 0; // 从PL消息获取的速度
|
int speed = 0; // 从PL消息获取的速度
|
||||||
int reliability = 0;
|
int reliability = 0; // RTK信号质量 1行 0不行
|
||||||
|
|
||||||
// 发布消息的参数
|
// 发布消息的参数
|
||||||
int publish_speed = 0; // 转速占空比 0-100
|
int publish_speed = 0; // 转速 0-2000
|
||||||
int publish_angle = 0; // [-66.0,66.0],负数表示左转,正数表示右转
|
int publish_angle = 0; // [-66.0,66.0],负数表示左转,正数表示右转
|
||||||
|
|
||||||
// 车体矩形边界(栅格坐标)
|
// 车体矩形边界(栅格坐标)
|
||||||
@ -677,15 +677,22 @@ private:
|
|||||||
// 发布控制指令
|
// 发布控制指令
|
||||||
sweeper_interfaces::msg::McCtrl message;
|
sweeper_interfaces::msg::McCtrl message;
|
||||||
message.sweep = (avoid_ctx_.state == AVOID_NONE); // 避障状态为无避障 且 任务开始 才开启清扫
|
message.sweep = (avoid_ctx_.state == AVOID_NONE); // 避障状态为无避障 且 任务开始 才开启清扫
|
||||||
message.gear = 0;
|
message.gear = 2; // 前进挡
|
||||||
message.brake = (publish_speed == 0) ? 1 : 0;
|
message.brake = (publish_speed == 0) ? 1 : 0;
|
||||||
message.rpm = publish_speed * 25;
|
|
||||||
|
if (reliability == 1)
|
||||||
|
message.rpm = publish_speed;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.rpm = 0;
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "rtk信号差,停车!!!");
|
||||||
|
}
|
||||||
message.angle = publish_angle; // 负数表示左转,正数表示右转
|
message.angle = publish_angle; // 负数表示左转,正数表示右转
|
||||||
message.angle_speed = 800;
|
message.angle_speed = 800;
|
||||||
|
|
||||||
pub_mc->publish(message);
|
pub_mc->publish(message);
|
||||||
|
|
||||||
RCLCPP_INFO_STREAM(this->get_logger(), "控制: 速度=" << publish_speed * 30 << ", 角度=" << publish_angle << ", 状态=" << [&]()
|
RCLCPP_INFO_STREAM(this->get_logger(), "控制: 速度=" << publish_speed << ", 角度=" << publish_angle << ", 状态=" << [&]()
|
||||||
{
|
{
|
||||||
switch(avoid_state_){
|
switch(avoid_state_){
|
||||||
case AVOID_NONE: return "无避障";
|
case AVOID_NONE: return "无避障";
|
||||||
@ -711,7 +718,7 @@ private:
|
|||||||
float target_angle = calculate_the_angle(x, y);
|
float target_angle = calculate_the_angle(x, y);
|
||||||
|
|
||||||
// 初始化控制参数
|
// 初始化控制参数
|
||||||
publish_speed = std::max(15, std::min(speed, 30)); // 限制速度范围
|
publish_speed = std::max(800, std::min(speed, 1500)); // 限制速度范围
|
||||||
publish_angle = static_cast<int>(target_angle);
|
publish_angle = static_cast<int>(target_angle);
|
||||||
|
|
||||||
// 安全检查:未检测到车体位置
|
// 安全检查:未检测到车体位置
|
||||||
@ -885,7 +892,7 @@ private:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 距离足够,可以减速接近
|
// 距离足够,可以减速接近
|
||||||
publish_speed = std::max(10, publish_speed / 2);
|
publish_speed = std::max(800, publish_speed / 2);
|
||||||
RCLCPP_INFO(this->get_logger(), "障碍物较宽,减速接近中,距离=%d格",
|
RCLCPP_INFO(this->get_logger(), "障碍物较宽,减速接近中,距离=%d格",
|
||||||
obstacle_analysis_.obstacle_distance);
|
obstacle_analysis_.obstacle_distance);
|
||||||
}
|
}
|
||||||
@ -1594,7 +1601,7 @@ private:
|
|||||||
double return_time = (current_time - avoid_ctx_.last_state_change_time).seconds();
|
double return_time = (current_time - avoid_ctx_.last_state_change_time).seconds();
|
||||||
|
|
||||||
// 恢复正常速度
|
// 恢复正常速度
|
||||||
publish_speed = std::min(25, speed);
|
publish_speed = std::min(1500, speed);
|
||||||
|
|
||||||
// 计算目标角度
|
// 计算目标角度
|
||||||
float target_angle = calculate_the_angle(x, y);
|
float target_angle = calculate_the_angle(x, y);
|
||||||
|
|||||||
@ -267,7 +267,7 @@ void PL_ProcThread()
|
|||||||
|
|
||||||
x = x_cm_tmp;
|
x = x_cm_tmp;
|
||||||
y = y_cm_tmp;
|
y = y_cm_tmp;
|
||||||
pl_speed = 80;
|
pl_speed = 1500;
|
||||||
task_status = TaskStatus::RUNNING;
|
task_status = TaskStatus::RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,19 +13,29 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <chrono> // 新增:用于时间戳处理
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
using namespace std::chrono; // 新增:时间戳命名空间
|
||||||
pthread_t pl_thread_t;
|
pthread_t pl_thread_t;
|
||||||
int is_start = 0;
|
int is_start = 0;
|
||||||
|
|
||||||
static int sock = -1;
|
static int sock = -1;
|
||||||
|
|
||||||
|
// 新增:全局变量记录最后接收RTK数据的时间戳
|
||||||
|
system_clock::time_point last_rtk_time;
|
||||||
|
// 新增:超时阈值(0.5秒)
|
||||||
|
const duration<double> rtk_timeout = duration<double>(0.2);
|
||||||
|
|
||||||
class pl_node : public rclcpp::Node
|
class pl_node : public rclcpp::Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
pl_node(std::string name) : Node(name)
|
pl_node(std::string name) : Node(name)
|
||||||
{
|
{
|
||||||
RCLCPP_INFO(this->get_logger(), "%s节点已经启动.", name.c_str());
|
RCLCPP_INFO(this->get_logger(), "%s节点已经启动.", name.c_str());
|
||||||
|
// 初始化最后接收时间为当前时间(避免初始状态直接超时)
|
||||||
|
last_rtk_time = system_clock::now();
|
||||||
|
|
||||||
// 创建订阅者订阅话题
|
// 创建订阅者订阅话题
|
||||||
msg_subscribe_ = this->create_subscription<sweeper_interfaces::msg::Rtk>("rtk_message", 10, std::bind(&pl_node::msg_callback, this, std::placeholders::_1));
|
msg_subscribe_ = this->create_subscription<sweeper_interfaces::msg::Rtk>("rtk_message", 10, std::bind(&pl_node::msg_callback, this, std::placeholders::_1));
|
||||||
task_subscribe_ = this->create_subscription<sweeper_interfaces::msg::Task>("task_message/download", 10, std::bind(&pl_node::task_callback, this, std::placeholders::_1));
|
task_subscribe_ = this->create_subscription<sweeper_interfaces::msg::Task>("task_message/download", 10, std::bind(&pl_node::task_callback, this, std::placeholders::_1));
|
||||||
@ -43,6 +53,9 @@ private:
|
|||||||
// 收到话题数据的回调函数
|
// 收到话题数据的回调函数
|
||||||
void msg_callback(const sweeper_interfaces::msg::Rtk::SharedPtr msg)
|
void msg_callback(const sweeper_interfaces::msg::Rtk::SharedPtr msg)
|
||||||
{
|
{
|
||||||
|
// 新增:更新最后接收时间戳
|
||||||
|
last_rtk_time = system_clock::now();
|
||||||
|
|
||||||
// RCLCPP_INFO(this->get_logger(), "lat:'%.9lf',lon:'%.9lf',head:'%lf',speed:'%lf',p_quality:'%d',h_quality:'%d'",
|
// RCLCPP_INFO(this->get_logger(), "lat:'%.9lf',lon:'%.9lf',head:'%lf',speed:'%lf',p_quality:'%d',h_quality:'%d'",
|
||||||
// msg->lat, msg->lon, msg->head, msg->speed, msg->p_quality, msg->h_quality);
|
// msg->lat, msg->lon, msg->head, msg->speed, msg->p_quality, msg->h_quality);
|
||||||
|
|
||||||
@ -50,7 +63,6 @@ private:
|
|||||||
if (msg->p_quality != 4 || msg->h_quality != 4)
|
if (msg->p_quality != 4 || msg->h_quality != 4)
|
||||||
{
|
{
|
||||||
g_rtk.reliability = 0;
|
g_rtk.reliability = 0;
|
||||||
RCLCPP_INFO(this->get_logger(), "rtk信号差!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_rtk.lat = msg->lat;
|
g_rtk.lat = msg->lat;
|
||||||
@ -80,6 +92,10 @@ private:
|
|||||||
|
|
||||||
void timer_callback_pl()
|
void timer_callback_pl()
|
||||||
{
|
{
|
||||||
|
// 新增:计算当前时间与最后接收时间的差值
|
||||||
|
auto now = system_clock::now();
|
||||||
|
duration<double> time_since_last = now - last_rtk_time;
|
||||||
|
|
||||||
if (is_start == 1)
|
if (is_start == 1)
|
||||||
{
|
{
|
||||||
if (sock < 0) // 首次连接
|
if (sock < 0) // 首次连接
|
||||||
@ -128,7 +144,23 @@ private:
|
|||||||
sweeper_interfaces::msg::Pl message;
|
sweeper_interfaces::msg::Pl message;
|
||||||
message.x = x;
|
message.x = x;
|
||||||
message.y = y;
|
message.y = y;
|
||||||
message.speed = (float)pl_speed;
|
|
||||||
|
// 修改:同时判断RTK信号质量和超时情况
|
||||||
|
if (g_rtk.reliability == 0 || time_since_last > rtk_timeout)
|
||||||
|
{
|
||||||
|
message.speed = 0;
|
||||||
|
if (time_since_last > rtk_timeout)
|
||||||
|
{
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "RTK数据超时(%.2fs),停车!!!", time_since_last.count());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "RTK信号差,停车!!!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
message.speed = (float)pl_speed;
|
||||||
|
|
||||||
message.reliability = g_rtk.reliability;
|
message.reliability = g_rtk.reliability;
|
||||||
// message.drive_mode = drive_mode;
|
// message.drive_mode = drive_mode;
|
||||||
if (drive_mode == Direction::STRAIGHT_D) // 直行
|
if (drive_mode == Direction::STRAIGHT_D) // 直行
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user