ROS1录包偶现一次崩溃问题定位

news2024/11/6 9:39:07

现象:崩到了mogo_reporter里面

堆栈:crash里面同时存在两个主线程的堆栈

代码

#include "boost/program_options.hpp"

#include <signal.h>

#include <string>

#include <sstream>

#include <iostream>

#include <thread>

#include <ros/ros.h>

#include "std_msgs/String.h"

#include "mogo_reporter/mogo_reporter.h"

#include "master.h"

#include "slave.h"

#include "configure.h"

namespace po = boost::program_options;

std::atomic<bool> gShutdown(false);

std::atomic<bool> gShouldRestart(true);

/**

 * Handle SIGTERM to allow the recorder to cleanup by requesting a shutdown.

 * \param signal

 */

void signal_handler(int signal)

{

  (void) signal;

  ros::requestShutdown();

  gShutdown.store(true);

  gShouldRestart.store(false);

}

int main(int argc, char** argv) {

    ros::init(argc, argv, "record_cache", ros::init_options::AnonymousName);

    MOGO_MSG_INIT_CFG("record_cache");

    gShouldRestart.store(false);

    setlocale(LC_ALL, "");

     

    signal(SIGTERM, signal_handler);

    signal(SIGINT, signal_handler);

    po::options_description desc("Allowed options");

    desc.add_options()

    ("help,h""produce help message")

    ("file,f",po::value<std::string>(),"config file path")

    ("create,c""create a record task")

    ("master""run as master")

    ("slave""run as slave");

    po::positional_options_description p;

    po::variables_map vm;

    try

    {

      po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);

    }

    catch (const boost::program_options::invalid_command_line_syntax &e)

    {

      ROS_ERROR("Error reading options: %s", e.what());

      return 1;

    }

    catch (const boost::program_options::unknown_option &e)

    {

      ROS_ERROR("Unknown options:%s", e.what());

      return 1;

    }

    if (vm.count("help"))

    {

      std::cout << desc << std::endl;

      exit(0);

    }

    if (vm.count("create"))

    {

    }

    if (vm.count("master"))

    {

    }

    if (vm.count("slave"))

    {

    }

    if (vm.count("file"))

    {

      record_cache::Configure::instance()->load(vm["file"].as<std::string>());

    }

    std::thread t([](){

      while(!gShutdown.load()) {

        if(!ros::master::check() && !gShouldRestart.load()) {

          ROS_WARN_STREAM("master offline, request shutdown!");

          ros::requestShutdown();

          gShouldRestart.store(true);

          break;

        }

        std::this_thread::sleep_for(std::chrono::milliseconds(200));

      }

    });

    t.detach();

    ros::NodeHandle node_handle("~");

    std::shared_ptr<record_cache::TaskManager> managerPtr;

    std::string hostname;

    char* str = getenv("ROS_HOSTNAME");

    if(!str) {

      hostname = "unknown";

    else {

      hostname = str;

    }

       

    ROS_DEBUG_STREAM("HOST:" << ros::master::getHost());

    std::string master = ros::master::getHost();

    if(hostname == master) {

      managerPtr = std::make_shared<record_cache::Master>();

    else {

      managerPtr = std::make_shared<record_cache::Slave>();

    }

       

    double pre_allocate_count_other;

    node_handle.param("pre_allocate_count_other", pre_allocate_count_other, static_cast<double>(1.5));

    managerPtr->setPreAllocateCountOther(pre_allocate_count_other);

    double pre_allocate_count_106;

    node_handle.param("pre_allocate_count_106", pre_allocate_count_106, static_cast<double>(2.5));

    managerPtr->setPreAllocateCount106(pre_allocate_count_106);

    int pre_allocate_pice_size = 0;

    node_handle.param("pre_allocate_pice_size", pre_allocate_pice_size, 100);

    managerPtr->setPreAllocatePiceSize(pre_allocate_pice_size);

    int trigger_mast_running_tasks_num = 3;

    node_handle.param("trigger_mast_running_tasks_num", trigger_mast_running_tasks_num, 3);

    managerPtr->setTriggerMastRunningTasksNum(trigger_mast_running_tasks_num);

    int trigger_mast_bduration = 10;

    node_handle.param("trigger_mast_bduration", trigger_mast_bduration, 10);

    managerPtr->setTriggerMastBduration(trigger_mast_bduration);

    int filter_record_interval = 5;

    node_handle.param("filter_record_interval", filter_record_interval, 5);

    managerPtr->setFilterRecordInterval(filter_record_interval);

    int single_msg_mast_size = 15;

    node_handle.param("single_msg_mast_size", single_msg_mast_size, 15);

    managerPtr->setSingleMsgMastSize(single_msg_mast_size);

    int bags_max_disk_space = 150;

    node_handle.param("bags_max_disk_space", bags_max_disk_space, 150);

    managerPtr->setbagsMaxDiskSpace(bags_max_disk_space);

     

    int record_time_split_size_gnss = 3600;

    node_handle.param("record_time_split_size_gnss", record_time_split_size_gnss, 3600);

    managerPtr->setRecordTimeSplitSizeGnss(record_time_split_size_gnss);

    int record_time_split_size_test = 1800;

    node_handle.param("record_time_split_size_test", record_time_split_size_test, 1800);

    managerPtr->setRecordTimeSplitSizeTest(record_time_split_size_test);

     

    // TODO 调整spin线程数量

    ros::AsyncSpinner s(0);

    s.start();

    managerPtr->start();

    ros::waitForShutdown();

     

    sleep(1);

    if(gShouldRestart.load()) {

      return 8;

    }

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PSINS】ZUPT代码解析(PSINS_SINS_ZUPT)|MATLAB

这篇文章写关于PSINS_SINS_ZUPT的相关解析。【值得注意的是】:例程里面给的这个m文件的代码,并没有使用ZUPT的相关技术,只是一个速度观测的EKF 简述程序作用 主要作用是进行基于零速更新(ZUPT)的惯性导航系统(INS)仿真和滤波 什么是ZUPT ZUPT是Zero Velocity Update(…

828华为云征文 | 使用华为云Flexus云服务器X安装搭建crmeb多门店商城教程

&#x1f680;【商城小程序&#xff0c;加速启航&#xff01;华为云Flexus X服务器助力您的业务腾飞】&#x1f680; 1、点击链接进入华为云官网&#xff0c;页面如下&#xff1a; 华为云Flexus云服务器X选购页面 https://www.huaweicloud.com/product/flexus-x.html 2、进…

Uniapp + Vue3 + Vite +Uview + Pinia 实现提交订单以及支付功能(最新附源码保姆级)

Uniapp Vue3 Vite Uview Pinia 实现提交订单以及支付功能&#xff08;最新附源码保姆级&#xff09; 1 效果展示2 提交订单2.1 cart.js2.2 submit-order.vue 3、支付页面order-pay.vue 1 效果展示 2 提交订单 2.1 cart.js // src/pages/store/cart/cart.js import {defineS…

【最新华为OD机试E卷】报文响应时间(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

mybatis获取参数的5种情况

Mybatis获取参数值的两种方式 mybatis获取参数值的方式有两种: ${} 和 #{} ${} 这个的本质就是字符串拼接 这个无法避免sql注入攻击 #{} 这个的本质就是占位符(尽量使用 #{} 的方式) 可以避免sql注入 mybatis获取参数值的情况 1.mapper接口方法的参数为单个字面量类型…

solidity-20-sendeth

发送ETH 这章的标题让我觉得奇怪&#xff0c;因为先前我也发送ETH&#xff0c;如上一篇提到的recieve和fallback函数。 重现了教程中的代码 // SPDX-License-Identifier: MIT pragma solidity ^0.8.21;contract sendeth{// 这个事件是为了打log,记录收到的eth和剩余的gas fee…

echarts中tooptips提示框超出了怎么解决

我们在制作echarts表格时&#xff0c;有时候会遇到提示框内容较多&#xff0c;会让提示框超出&#xff0c;展示不全数据&#xff0c;如下&#xff1a; 这种情况下需要在tooltips下增加一些属性&#xff1a; 1.confine: true&#xff1a;这个配置的作用是让提示框&#xff08;t…

Docker笔记-容器数据卷

Docker笔记-容器数据卷 docker的理念将运行的环境打包形成容器运行&#xff0c;运行可以伴随容器&#xff0c;但是我们对数据的要求是希望持久化&#xff0c;容器 之间可以共享数据&#xff0c;Docker容器产生的数据&#xff0c;如果不通过docker commit生成新的镜像&#xf…

大数据新视界 --大数据大厂之数据挖掘入门:用 R 语言开启数据宝藏的探索之旅

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

类型转换等 面试真题

题目1 请问哪个结果为NaN A. 123null B. 123‘1’ C. 123/0 D. 123undefined 在这四个表达式中&#xff0c;只有D. 123 undefined 的结果是 NaN&#xff0c;原因如下&#xff1a; A. 123 null 结果是&#xff1a;123原因&#xff1a;null 在数值运算中会被自动转换为 0&a…

mac上什么压缩软件没有广告,苹果电脑解压软件BetterZip有广告吗

mac上有很多压缩软件&#xff0c;可以帮助用户压缩或解压各种格式的文件&#xff0c;如zip、rar、7z等。但是&#xff0c;有些压缩软件会在使用过程中弹出广告&#xff0c;影响用户的体验和效率。那么&#xff0c;mac上什么压缩软件没有广告呢&#xff1f;苹果电脑解压软件Bett…

一步步教你利用大模型开发个性化AI应用,告别‘人工智障’!

为了回答这个问题&#xff0c;我用说人话的方式拿gpts创建了一个“我”&#xff0c;然后让她来回答这个问题。&#xff08;确认过眼神&#xff0c;我是懂套娃的&#xff09; 接下来我会先展示下整个定制过程&#xff1b;然后我们一起看一下她能把题答到什么程度&#xff1b;最后…

UnrealEngine 打包Android平台应用

虚幻引擎 支持将项目发布到 安卓&#xff08;Android&#xff09; 移动设备上&#xff0c;并且提供了若干功能帮你将项目发布到 谷歌游戏商店。本节包含了如何设置Android开发环境、如何使用Android功能和服务、以及如何为发布游戏做准备相关的指南。 当前SDK要求 当前UE版本…

JavaSE篇之内部类和图书系统

1.内部类(类中类) 在Java中&#xff0c;将一个类定义在另一个类内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类。 注意事项&#xff1a; 1. 1.静态内部类&#xff08;被static修饰的内部类&#xff09; 1.在静态内部类的方法中不能直接引用外部类的成员变量&…

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月&#xff0c;中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》&#xff08;银办发〔2021〕146 号&#xff09;&#xff0c;规范金融机构合理应用开源技术&#xff0c;提高应用水平和自主可控能力&#xff0c;促进开源技术健康可持续发展。前期&a…

幻灯片放映过程中如何调出激光笔

1、第一步先打开制作好的幻灯片 2、进行幻灯片放映 3、看到上图最下面一行&#xff0c;减号左方的小杯进入幻灯片播放 4、幻灯片下方有个放映&#x1f58a;&#xff0c;点击一下 5、选择激光笔就好啦

基于Java的建筑节能监测系统+公共建筑能耗监测系统+建筑能耗监测系统+节能监测系统+能源管理系统

建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建…

el-table表格的展开行,初始化的时候展开哪一行+设置点击行可展开功能

效果&#xff1a; 表格展开行官网使用&#xff1a; 通过设置 type"expand" 和 Scoped slot 可以开启展开行功能&#xff0c;el-table-column 的模板会被渲染成为展开行的内容&#xff0c;展开行可访问的属性与使用自定义列模板时的 Scoped slot 相同。 但是这种方法…

开源 TTS 模型「Fish Speech」1.4 发布;GameGen-O :生成开放世界游戏视频模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

计算机网络:概述 - 性能指标

目录 一. 速率 二. 带宽 三. 吞吐量 四. 时延 五. 时延带宽积 六. 往返时间RTT 七. 利用率 八. 丢包率 此博客介绍计算机网络中的性能指标&#xff0c;性能指标从不同的角度来度量计算机网络的性能。下面介绍几个常用的性能指标&#xff1a; 一. 速率…