内存泄露问题+CANAPI+车道线宽+图像外参标定

?

  1. 内存泄露

    在测试决策程序过程中,我们发现一个奇怪的问题,每次开启程序,连接网线向dsbase发送数据的过程中,竟然会有每次4k的内存泄露,1s 增加一次。不知道是什么鬼。

    找了很多资料,依然没有解决问题。但是,奇怪的是,用win7 64位机子以及公司电脑做测试,竟然没有内存泄露,没有出现类似的错误。奇怪。

后来,陆续做实验测试,终于发现问题所在。原来是前方DENSO雷达在往CAN卡上发送数据,而我程序当中并没有对此数据进行接收,导致内存泄露。即使是同一个CAN卡,

假如在程序当中不进行处理的话,也不行。之前一直认为,CAN API只会对一个CAN端口有效,现在看来不是,所以,对于同一个CAN设备,最好是在一个进程里面进行管理所有的端口,

有数据收发就接收和发送就行啦。不然会造成内存泄露。切记。切记。

参考资料:

http://bbs.csdn.net/topics/390292180 发送数据内存泄露,每次循环4k增加

http://bbs.csdn.net/topics/360163468 多线程运行时内存泄露

?

http://www.cnblogs.com/yixiaoyang/archive/2010/12/10/1902255.html
vs环境下的内存泄露检测工具

?

?

?

http://blog.csdn.net/wxqian25/article/details/17258407
BoundsChecker 使用

?

?

http://download.csdn.net/user/yth796/uploads/2
BoundsChecker 下载

?

官网:
http://supportline.microfocus.com/

?

可能原因:
同步那一块的问题, createThread的问题。试过,问题不在这。

用此函数试试,调用线程

?

2、关于CANET API的使用

为了使程序尽可能的稳定运行,使用的库最少化,改用周立功提供的CAN库进行编程。

在用下面的程序过程中,一开始死活配置不成功,总是在VCI_OpenDevice(); 后来,改配置通通都试了一遍还是不成功。

最后,自己写了一个测试程序,居然跑通了。最后的原因,应该还是项目的配置有问题。后来,该用新建的项目配置工程,完美解决。

也就是说,下次排查问题的时候,我们需要一项项进行测试,而不是整体测试。

  1. #ifndef WIN_CAN_H
  2. #define WIN_CAN_H
  3. ?
  4. #include <iostream>
  5. #include "ControlCAN.h"
  6. ?
  7. using
    namespace std;
  8. ?
  9. ?
  10. //CAN 相关
  11. ?
  12. const
    static DWORD nDeviceType = VCI_CANETE; //设备类型
  13. const
    static DWORD nDeviceInd = 0; //设备索引号
  14. const
    static DWORD nCANInd = 0; //设备端口号
  15. ?
  16. class Win_Can
  17. {
  18. public:
  19. ???Win_Can(){}
  20. ???~Win_Can()
  21. ???{
  22. ??????VCI_CloseDevice(nDeviceType,nDeviceInd);
  23. ???}
  24. ?
  25. ????int write_to_can(VCI_CAN_OBJ frames[], int len) //支持发送多帧
  26. ???{
  27. ??????int ret = VCI_Transmit(nDeviceType,nDeviceInd,nCANInd,frames,len);
  28. ??????if (ret < 1)
  29. ??????{
  30. ?????????std::cout << "发送失败" << std::endl;
  31. ??????}
  32. ??????return ret;
  33. ???}
  34. ?
  35. ???int read_from_can(VCI_CAN_OBJ &frame) //一帧帧的读取
  36. ???{
  37. ??????int receiver = VCI_Receive(nDeviceType,nDeviceInd,nCANInd,&frame,1);//如果每次只接收一帧,是不是更好处理?
  38. ??????if (receiver <= 0)
  39. ??????{
  40. ?????????VCI_ReadErrInfo(nDeviceType,nDeviceInd,nCANInd,&errinfo);
  41. ??????}
  42. ??????return
    true;
  43. ???}
  44. ?
  45. ???bool init_can(string DesIP, int DesPort)
  46. ???{
  47. ??????/************************************************************************/
  48. ??????/* CAN卡初始化 */
  49. ??????/************************************************************************/
  50. ??????int nReserved = DesPort;
  51. ??????if (VCI_OpenDevice(nDeviceType,nDeviceInd,nReserved) != 1)
  52. ??????{
  53. ?????????std::cout << "打开设备失败,请检查设备类型和设备索引号是否正确" << std::endl;
  54. ?????????VCI_CloseDevice(nDeviceType,nDeviceInd);
  55. ?????????return
    false;
  56. ??????}
  57. ?
  58. ??????VCI_SetReference(nDeviceType,nDeviceInd,nCANInd,CMD_DESIP,(PVOID)DesIP.c_str());
  59. ??????VCI_SetReference(nDeviceType,nDeviceInd,nCANInd,CMD_DESPORT,(PVOID)&nReserved);
  60. ?
  61. ???VCI_ClearBuffer(nDeviceType,nDeviceInd,nCANInd);//清空缓冲区
  62. ????????return
    true;
  63. ???}
  64. ?
  65. public:
  66. ???VCI_ERR_INFO errinfo;
  67. ?
  68. };
  69. ?
  70. ?
  71. ?
  72. ?
  73. #endif

?

3、标定图像外参

图像外参主要有以下参数:

Wheel_Offset 85???? 相机到前轮中轴线的纵向距离

Head_Offset 168???? 相机到车前保险杠的纵向距离

Width_Offset_L 115???? 相机离左轮的横向距离

Width_Offset_R 63???? 相机离右轮的横向距离

Camera_tanr0 20.00 相机的pitch 角度

Camera_Height 138 相机离地面的高度

?

?

在调节pitch 角度的时候,我们有几种方式:

  1. 当两条直线的交点无法得到的时候,我们可以通过人为调节Camera_tanr0,然后查看逆透视的效果来标定,原则上,逆透视之后的车道线应该是平行的,当车道线不平行,说明标定有问题,我们需要调节角度。
  2. 还有一种方式,Camera_tanr0 不变,调节相机,我们可以看到识别到的车道线在变化。

下面是已经标定好的车道线示意图:

?

?

4、修改车道宽

之前图像程序中有一个bug,当没找到两条车道线的时候,人为的补上半个车道宽1.8m,当我们在检测到一条车道的时候,由于我们铺设的车道线不标准,导致卡丁车,路线来回抖动。

后来,加上一个获取前一次的车宽解决问题。

增加的代码如下:lane_width变成变量。

下图是检测到一条边和两条边的情况。图1是检测到一条边的情况,右侧车道线是虚拟中心线,自己补出来的。

图2 是检测到2条边的情况,中间的一条是虚拟中心线,通过左右车道线计算得到。

时间: 2024-11-10 07:10:07

内存泄露问题+CANAPI+车道线宽+图像外参标定的相关文章

相机的内参外参标定

http://wiki.ros.org/openni_launch/Tutorials/IntrinsicCalibration http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration https://blog.csdn.net/heyijia0327/article/details/43538695 原文地址:https://www.cnblogs.com/nku-wangfeng/p/9966855.html

Android开发——Handler引起的内存泄露

在Android异步消息处理中, Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // } }; 但当我们这么写时,编译器会给出警告提示:Handler类应该是静态的,可能发生内存泄漏. 原因: 在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用.静态的内部类不会持有外部类的引用. 这里Handler是一个匿名内部类的实例,其持有外面的Activity的引

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它

.Net内存泄露原因及解决办法

1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需要简单回顾一下. 以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码. 在运行库的控制下执行的代码称作托管代码.相反,在运行库之外运行的代码称作非托管代码.COM 组件.ActiveX 接口和 Win32 API 函数都是非托管代码的示例. COM/COM++组件,ActiveX控件,API函数,指针运算,自

android内存优化-Activity, Thread引起的内存泄露0

Android编程中一个共同的困难就是协调Activity的生命周期和长时间运行的任务(task),并且要避免可能的内存泄露.思考下面Activity的代码,在它启动的时候开启一个线程并循环执行任务. 1 /** 2 * 一个展示线程如何在配置变化中存活下来的例子(配置变化会导致创 3 * 建线程的Activity被销毁).代码中的Activity泄露了,因为线程被实 4 * 例为一个匿名类实例,它隐式地持有外部Activity实例,因此阻止Activity 5 * 被回收. 6 */ 7 pu

内存泄露 Memory Leaks 内存优化【总结】

什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是会频繁地发生内存泄露(Memory Leaks). 内存泄漏就是:当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放他们. 或者说是:我们对某一内存空间使用完成后没有释放. 用白话来说就是:该回收的内存没被回收. 要理解这个定义,我们需要理解内存中的对象状态.下图展示了什么是

C/C++内存泄露检测

gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4Copyright (C) 2013 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 一.mtrace 1.介绍

了解和防止内存泄露

支持面向对象编程Delphi是如此丰富和强大.雷和对象允许模块化编程.除了更多的模块和更多复杂的组件外,同时也带了更多的迷惑和更多复杂的Bugs. 当用Delphi开发一个程序(几乎)总是那么的有趣,当你感觉整个世界都在反对你的这个局面下. 无论什么时候你需要创建一个对象你就得释放它所使用的内存.无疑此时try...finally...end语句块可以帮助你防止内存泄露:它会持续不断的监视你的代码的安全性. 当程序失去释放它所耗费的内存的能力的时候就会发生内存(或资源)泄露.重复的内存泄露会导致

Java内存泄露的理解与解决

Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露.Java语言对内存管理做了自己的优化,这就是垃圾回收机制.Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage collection)负责自动回收不再使用的内存. 上面是Java内存管理机制的基本情况.但是如果仅仅理解到这里,我们