c++
文章平均质量分 54
Jack Ju
硕士毕业于哈尔滨工业大学控制科学与工程系,目前是一名自动驾驶工程师。
展开
-
C++ boost::property_tree::read_json读取虚拟墙文件
json中含有一系列的线段起点和终点,我们的目标时是其提取出来。输入是一个json文件如下。原创 2024-06-26 11:15:56 · 355 阅读 · 1 评论 -
C++类 单例模式
类使用了一个单例模式,这意味着这个类只需要一个实例,并且提供了全局访问点来获取这个实例。这通常用于控制对一个类实例的访问,尤其是在创建实例代价昂贵或者需要严格控制实例数量的情况下。单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在这个修正后的代码中,我们确保了构造函数和析构函数是私有的,并且提供了一个全局访问点来获取。方法返回类的唯一实例的引用,您可以使用该引用来访问和调用类的公有成员函数。在您的代码中,单例模式的实现确保了。原创 2024-04-02 10:05:25 · 823 阅读 · 1 评论 -
Linux系统中段错误信号sigsegv的捕获
但是,在某些情况下,我们希望能够捕获这个信号,并进行一些特定的处理,比如打印出错信息、记录日志或者进行资源清理等,而不是让程序立即退出。在上述代码中,为了简化,我们没有包含这部分内容,但在实际开发过程中,这是非常重要的一步。的错误,例如,确保指针在使用前已经被正确初始化,数组访问不超过其边界等。在信号处理函数中,我们可以进行错误处理,比如打印相关信息或者清理资源。在Linux系统中,当程序试图访问它没有权限访问的内存区域时,操作系统会发送一个。在上面的代码中,我们使用。在实际的应用中,处理。原创 2024-04-02 09:24:42 · 576 阅读 · 0 评论 -
C++ 代码优化—set(CMAKE_CXX_FLAGS_RELEASE “-O2“)
在对导航代码进行交叉编译的时候,由于线程占CPU资源过大,我在CMake中添加如下优化。交叉编译可以通过,但是在目标平台arm上运行报线程相关错误。程序正常运行,占用CPU资源也降下来了。原创 2024-01-02 19:05:29 · 730 阅读 · 0 评论 -
C++ boost planner_cond_.wait(lock) 报错1225
在进入gdb后输入 bt,用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。通过这种方式,我们保证了唤醒的线程可以获得互斥量的所有权,并避免在没有所有权的情况下解锁互斥量导致的错误。在进入gdb后输入where并回车,就可以指出是在哪一行被Down掉,在哪个函数内,由谁调用等等。重新上锁互斥量,以便在下一次循环开始时可以正确地等待新的条件变量通知。等待条件变量的通知,并在等待之前释放锁。对象会自动重新获取互斥量的所有权,然后我们继续执行计划的操作。原创 2023-12-25 11:06:34 · 1034 阅读 · 0 评论 -
C++ 枚举的用法
语句根据不同的状态进行判断并输出相应的信息。在这个例子中,输出结果将为"Currently in clearing state。上述代码定义了一个枚举类型。原创 2023-12-21 15:11:37 · 511 阅读 · 0 评论 -
valgrind定位C++线程/内存等错误
Valgrind 由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind 是一套 Linux 下,开放源代码(GPL V2)的仿真调试工具的集合。原创 2023-12-18 14:12:59 · 445 阅读 · 0 评论 -
机器人导航地图——costmap局部地图滚动costmap_.updateOrigin理解
代价地图的一个参数,表示该代价地图的world坐标系原点(origin_x_, origin_y_)【**代价地图原点都在地图的左下角】**是否要随着机器人移动而改变。local_map是目标,它的宽度等于源中要复制的宽度cell_size_x,因为每栅格值一个字节,这个宽度也等于跨距。一是重新计算原点origin_x_/y_,方法是微调参数new_origin_x、new_origin_y,确保新原点坐标能被resolution_(0.05)整除。的实现,用于将源地图的一个区域拷贝到目标地图中。原创 2023-12-06 15:42:06 · 1777 阅读 · 0 评论 -
C++延时程序
函数获取的是 CPU 时间,不会导致线程或进程的真正休眠。要实现真正的睡眠功能,可以使用适当的跨平台库或操作系统提供的相关函数。输出了起始时间、当前时间和当前时间减去起始时间的差值,以观察程序的运行状态。,即当前时间减去起始时间小于等于指定的时间。头文件,以便使用标准输入输出和时间相关函数。函数来获取当前的CPU时间,进行延时操作。函数获取当前的 CPU 时间,将其赋值给。函数,该函数用于模拟程序暂停一段时间。函数来进行简单的时间控制,以及使用。参数,用于指定程序要休眠的时间。的函数,该函数接受一个。原创 2023-12-04 16:00:21 · 593 阅读 · 0 评论 -
C++高级用法—使用boost::shared_ptr来创建共享指针对象并保持了多态性的特性
这样,就可以使用基类的指针对象来操作派生类的对象,并且在运行时动态地选择适当的函数实现。这就是使用多态性的一种常见做法。本文我们将使用了boost::shared_ptr来创建共享指针对象,并且实现多态的功能。类型的指针进行使用。这就实现了多态性,即可以通过基类的指针来操作不同派生类的对象。(1)我们将上述代码文件命名为virtual.cpp。首先,我们创建了三个共享指针对象。类的子类,因此可以将它们作为。原创 2023-12-04 15:24:24 · 708 阅读 · 0 评论 -
C++类中运算符(operator())的重载
在函数体内,它将costmap_[offset]设置为value_,即将costmap中对应的单元格标记为指定的值。在这个例子中,MarkCell类重载了函数调用运算符operator(),当类的对象被调用时,就会调用这个重载的函数调用运算符。在函数调用运算符的实现中,接受了一个unsigned int类型的参数offset,表示要标记的单元格在costmap中的偏移量。这样,通过创建一个MarkCell对象,并将对象作为函数来调用,就可以将指定的单元格在costmap上进行标记。原创 2023-12-01 09:58:04 · 459 阅读 · 0 评论 -
C++boost线程唤醒
消费者则等待数据准备好的通知,收到通知后输出并消费数据。这样可以确保只有一个消费者线程会被唤醒来消费新的数据,从而避免多个线程同时访问和处理同一份数据,确保线程安全。函数用于通知一个等待在条件变量上的线程。它会唤醒一个等待的线程,使其从等待状态返回到可运行状态。这样可以保证消费者线程只有在新的数据产生时才会执行消费操作。在这个示例中,我们创建了一个生产者线程和一个消费者线程。来通知消费者线程有新的数据可供消费。也只会唤醒其中的一个线程,而不是所有线程都唤醒。在本例中,生产者线程在每次生产新数据后会调用。原创 2023-11-24 11:24:44 · 521 阅读 · 0 评论 -
C++ Boost Thread 编程总结
标准C++线程即将到来。CUJ预言它将衍生自Boost线程库,现在就由Bill带领我们探索一下Boost线程库。就在几年前,用多线程执行程序还是一件非比寻常的事。然而今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率;为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序;GUI应用程序将那些费时,复杂的处理以线程的形式单独运行,以此来保证用户界面能够及时响应用户的操作。这样使用多线程的例子还有很多。但是C++标准并没有涉及到多线程,这让程序员们开始怀疑是否可能写出多线程的C++程序。原创 2023-11-22 15:24:28 · 259 阅读 · 0 评论 -
C++ vector 使用类作为模板参数/C++多态展示
【代码】C++ Vector使用类成员。原创 2023-11-21 08:57:13 · 136 阅读 · 0 评论 -
机器人控制——C++ HSM状态机基础知识
首先,我们包括hsm/statemachine.h,它引入了整个hsm库。我们宣布一个名为First状态。状态是继承自hsm::State的结构或类。注意:我们更喜欢使用structs而不是类,因为默认情况下它们是公开派生的,所以不需要指定“public”关键字。主要来说,我们初始化一个StateMachine对象,告诉它First是它的初始状态。所有StateMachine都必须有一个初始状态才能启动。原创 2023-11-06 08:56:28 · 884 阅读 · 1 评论 -
Linux 下C++工程编译
创建文件夹。原创 2023-11-01 09:33:16 · 162 阅读 · 0 评论 -
C++基础之关键字——virtual详解
被修饰的函数称为虚函数, 是C++中多态的一种实现(多说一句,多态分编译时多态-通过重载实现和运行时多态-通过虚函数实现)。也就是说用父类的指针或者引用指向其派生类的对象,当使用指针或引用调用函数的时候会根据具体的对象类型调用对应对象的函数(需要两个条件:父类的函数用virtual修饰和子类要重写父类的函数)。通过上面的例子可以看出,使用virtual修饰的函数会根据实际对象的类型来调用,没有使用virtual修饰的根据指针的类型来调用。修饰父类中的普通函数。原创 2023-10-30 09:00:47 · 244 阅读 · 0 评论 -
r如何设计一条曲率变化平滑的CC曲线
原创 2023-04-12 00:06:54 · 165 阅读 · 0 评论 -
【梯度下降——多个参数估计】【随笔-20221127】
最新代码能收敛,但是精度不高。原创 2022-11-27 20:51:31 · 601 阅读 · 0 评论 -
龙格-库塔(Runge-Kutta)方法C++实现
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。原创 2022-11-12 23:02:04 · 3663 阅读 · 0 评论 -
第 304 场力扣周赛
平常做代码题目较少,今天迟迟不能入睡,我愈发觉得她说的对,我思考了下,确实有很大概率,对十年内做的目标,有很大可能不能实现。第一步操作选出x=1,之后nums=[0,4,0,2,4]。第二步操作选出x=2,之后nums=[0,2,0,0,2]。第三步操作选出x=2,之后nums=[0,0,0,0,0]。解释nums中的每个元素都已经是0,所以不需要执行任何操作。输入nums=[1,5,0,3,5]输入nums=[0]...原创 2022-08-01 00:41:59 · 470 阅读 · 0 评论 -
机器学习—使用Gradient Descent预测房价—c++实现
之前写了一篇梯度下降的c语言实现,听吴恩达机器学习的入门课,于是考虑自己写一个简易的机器学习的例子。我们打算做一个model为f(x)=W*x+B这样简单的模型。背景可以理解为房子的面积对应不同的价格。x为房子的面积,纵坐标为房价。............原创 2022-07-29 16:30:33 · 672 阅读 · 0 评论 -
递归的底层机制
编程语言中,我们习惯将函数(方法)调用自身的过程称为递归,调用自身的函数称为递归函数,用递归方式解决问题的算法称为递归算法。函数(方法)调用自身的实现方式有 2 种,分别是:设计递归函数时,我们必须为它设置一个结束递归的“出口”,否则函数会一直调用自身(死循环),直至运行崩溃。接下来我们以“用递归方式求 n! ”为例,给大家展示一个正确的递归函数。n! 指的是求 123*…*n 的值,如下 C 语言程序中的 factorial() 就是实现求 n! 的递归函数:#include int...原创 2022-06-24 15:37:16 · 420 阅读 · 0 评论 -
用十年来学编程
用十年来学编程Peter Norvig为什么每个人都急不可耐?走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在 Amazon.com上进行了如下 搜索:pubdate: after 1992 and title: days and (title: learn or title: teach your转载 2022-05-29 21:08:54 · 178 阅读 · 0 评论 -
C++虚函数笔记
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。当父类定义了虚函数时,在子类进行继承的时候会将父类的虚函数表也给继承下来所以那一些虚函数在子类中也是virtual类型的,如果要对父类中的虚函数进行重写时或添加虚函数,顺序是:(图表说明为图一)①先将父类的虚函数列表复制过来②重写虚函数时是把从父类继承过来的虚函数表中对应的虚函数进行相应的替换。③如果子类自己要添加自己的虚函数,则是把添加的虚函数加到从父类继原创 2022-05-29 20:33:13 · 110 阅读 · 0 评论 -
动态内存C++笔记
动态内存可以动态的申请数组的内存空间,用多少申请多少,用完可以释放内存,进而节省内存空间内你。内存申请和释放有两组方式:(1)new 和delete(2)malloc 和free一、new和delete使用new动态分配内存,使用delete释放内存空间。语法:类型名 *指针变量 = new 类型名[元素个数]eg.int =5int *pNum = new int[i]1.代码实现代码如下(示例):#include<iostream>#include<原创 2022-05-26 18:07:12 · 153 阅读 · 0 评论 -
使用 C++ Eigen 包的最小二乘多项式拟合
通常在处理传感器数据(或信号)时,我们会发现数据通常不干净并且存在大量噪声。这种噪声使得执行进一步的数学运算变得更加困难,例如微分、积分、卷积等。此外,如果我们打算将这些信号用于控制自动驾驶汽车、机器人等实时操作,那么这种噪声会带来很大的挑战。手臂或工业厂房,因为噪声往往会在任何下游数学运算中放大。在这种情况下,一种通用方法是平滑数据以去除噪声。我们寻求实时平滑这些数据,以用于控制工程中的应用,例如自动驾驶汽车或机器人的智能控制。已经开发了许多方法来实时平滑信号,例如卡尔曼滤波器、扩展卡尔曼滤...原创 2022-05-27 18:00:33 · 4994 阅读 · 3 评论 -
Linux内核编程(1)
前言不同于windows驱动程序,Linux设备驱动程序在与硬件设备之间建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,通过open,close,read,write等系统调用对设备进行操作,如此一来也大大简化了linux驱动程序的开发,后面会看到,通过file_operations这个结构体(实际上是一个函数指针的集合),把驱动的操作和设备号联系起来,程序员所要做的工作只是通过file_operations挂接自己的系统调用函数。linux中的设备可大致分为字符设备、块设备、网络设备等原创 2022-05-26 18:22:57 · 581 阅读 · 0 评论 -
数组指针清析
参考链接https://gitpress.io/@switernal/2020-02-11-C%E5%92%8CC++%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88%E5%92%8C%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84原创 2021-11-20 12:14:31 · 70 阅读 · 0 评论 -
git分支创建与合并
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6原创 2021-07-16 16:32:22 · 119 阅读 · 0 评论 -
c++动态内存理解
C++ 程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相.原创 2021-01-14 20:08:23 · 171 阅读 · 0 评论 -
C++虚函数的理解(转)
参考链接:https://baijiahao.baidu.com/s?id=1653132502323288772&wfr=spider&for=pc初学者刚接触C++语言中的 virtual 函数(虚函数)时,常常会感觉到迷惑,比如,书上说虚函数定义在基类中,其他继承此基类的派生类都可以重写该虚函数,因此虚函数是C++语言多态特性中非常重要的概念。但是派生类也可以重写基类中的其他的常规函数(非虚函数)呀,那为什么还要引入虚函数这样看起来很复杂的概念呢?为什么要引入虚函数?“猫吃原创 2021-01-14 10:02:49 · 130 阅读 · 0 评论 -
C++ 锁的作用
C++锁可分为互斥锁、读写锁(共享锁),递归锁;std::mutex mutexx;//普通锁互斥锁 //包含在头文件<mutex>std::recursive_mutex recursive_mutexx; //递归锁 //包含在头文件<recursive_mutex >std::shared_mutex shared_mutexx; //读写锁 //包含在头文件<shared_mutex>互斥锁是为了避免数据竞争而产生的,即避免多个线程同时访问同一原创 2021-01-09 10:21:15 · 1078 阅读 · 0 评论