본문 바로가기

코딩 에러

YDLidar Tmini buffer overflow python terminated 꿀팁

YDlidar 센서를 USB로 꽂아서 사용할 때, python 실행시에만 buffer overflow 메세지를 확인할 수 있다.

특히 Ubuntu에서만 발생하는 것을 확인하였으며, 윈도우에서는 정상 작동하는 것을 확인하였음

 

일단 접근 권한을 위해서 항상 sudo로 실행시키는 정도는 알고 있을 것

 

몇 단계 막히는 구간이 있었는데, 꿀팁 몇 개 알려준다.

 

1. 일반적인 SDK를 사용하면 안됌. 꼭 1.1.2로 실행해야함

YDLidar-SDK_1.1.2_tf.zip
17.99MB

 

1.1.2는 Tmini 홈페이지에서 SDK를 누르면 다운로드 되는 데, 그 버젼이 1.1.2이며, github에서는 다운로드 받을 수 없음.

이 버젼 코드를 사용하지 않으면, X2는 몰라도 Tmini는 인식 자체를 못했었음

 

2. ROS 패키지들 설치

이건 뭐 cmake등의 단계에서 나오는 거니까 그렇다고 치고

 

3. sudo로 실행

당연히 /dev/ttyUSB0으로 접근하니까 sudo로 python을 실행해야함

 

4. c++로 테스트 하면서 진행해보자

빌드를 하면, tmini_test라는 실행파일이 build폴더에 생길 텐데, 이걸 ./tmini_test로 실행해서 3 그리고 y를 순서대로 눌러준다.

(baudrate에 따라 230400으로 해줘야함.)

 

make

sudo make install

cd ..

sudo python3 setup.py install

해서 ydlidar-1.0.2 python 라이브러리까지 설치를 완료하고 예제 코드를 실행해보면 에러가 난다. 

 

일반적인 좋은 예제는 잘 안되서, C++로 잘 됐었던 예제를 그대로 python으로 코드를 옮겨서 구현해주었다.

 

import os
import ydlidar

if __name__ == "__main__":
    ydlidar.os_init()
    laser = ydlidar.CYdLidar()
    ports = ydlidar.lidarPortList()
    port = "/dev/ydlidar"
    for key, value in ports.items():
        port = value
    print("PORTS : {}".format(port))

    if True:
        laser.setlidaropt(ydlidar.LidarPropSerialPort, port)
        ignore_array = ""
        laser.setlidaropt(ydlidar.LidarPropIgnoreArray, ignore_array)

        # init property
        laser.setlidaropt(ydlidar.LidarPropSerialBaudrate, 230400)
        laser.setlidaropt(ydlidar.LidarPropLidarType, ydlidar.TYPE_TRIANGLE)

        laser.setlidaropt(ydlidar.LidarPropDeviceType, ydlidar.YDLIDAR_TYPE_SERIAL)


        laser.setlidaropt(ydlidar.LidarPropSampleRate, 3)

        laser.setlidaropt(ydlidar.LidarPropAbnormalCheckCount, 4)

        laser.setlidaropt(ydlidar.LidarPropIntenstiyBit, 8)
        
        laser.setlidaropt(ydlidar.LidarPropFixedResolution, False)

        laser.setlidaropt(ydlidar.LidarPropReversion, False)
        
        laser.setlidaropt(ydlidar.LidarPropInverted, False)
        laser.setlidaropt(ydlidar.LidarPropAutoReconnect, True)
        laser.setlidaropt(ydlidar.LidarPropSingleChannel, True)
        laser.setlidaropt(ydlidar.LidarPropIntenstiy, True)
        laser.setlidaropt(ydlidar.LidarPropSupportMotorDtrCtrl, True)
        laser.setlidaropt(ydlidar.LidarPropSupportHeartBeat, False)
        
        
        laser.setlidaropt(ydlidar.LidarPropMaxAngle, 180.0)
        laser.setlidaropt(ydlidar.LidarPropMinAngle, -180.0)

        laser.setlidaropt(ydlidar.LidarPropMaxRange, 64.0)
        laser.setlidaropt(ydlidar.LidarPropMinRange, 0.05)

        laser.setlidaropt(ydlidar.LidarPropScanFrequency, 8)

        laser.enableGlassNoise(False)
        laser.enableSunNoise(False)


    ret = laser.initialize()
    if ret :
        ret = laser.turnOn()

        scan = ydlidar.LaserScan()
        while ret and ydlidar.os_isOk():
            print("doing process sample")
            r = laser.doProcessSimple(scan)
            if r:
                print("Scan received[",scan.stamp,"]:",scan.points.size(),"ranges is [",1.0/scan.config.scan_time,"]Hz");
            else :
                print("Failed to get Lidar Data.")
        laser.turnOff()
    laser.turnOff()

 

근데 buffer overflow 메세지가 뜬다.

분명히 똑같이? 라기보다 비슷하게 세팅을 해주었는데도...

 

원인을 찾아 C++ 코드를 들어가본다.

코드 중에 CYdLidar.cpp를 들어가보면 (src/CydLidar.cpp)

handleVersionInfoByPackage(debug) 가 있다.

펌웨어 업데이트 체크하는 함수인 것 같다.

일단 구현이 급해서 이 부분에서 에러난다는 것을 확인하고, 없어도 상관 없다고 판단하여 주석처리를 했다.

그리고 다시

build 폴더에 들어가서

make

sudo make install

cd ..

sudo python3 setup.py install

해주고 실행하면 정상 실행된다.

 

없어서 상관이 아예 없는 지는 음... 100% 장담은 못하고 일단 개발이 급하여 주석 처리하고 작업에 들어간다. 

추후에 완벽하게 buffer overflow를 잡으면 다시 글을 쓸 것.

 

보는 분이 있을련지는 모르겠지만...