🦔

WindowsでYDLIDARを使う

2024/09/19に公開

はじめに

こんにちは、大学4年のAkkunlabです!
主にプログラミングや電子工作などをしています。
今回は、WindowsでYDLIDARで扱う際の手順について、記事にしていきたいと思います。
間違いや不明点があれば、ご指摘いただけると幸いです!

用語

言葉 意味
SDK Software Development Kitの略で、開発に必要なツール、ライブラリ、ドキュメントなどをまとめたもの
vcpkg Windows用のC++パッケージマネージャー
CMake CMakeは、コンパイラに依存しないオープンソースのビルドシステム

SDK

Windows用のInstall手順です。
プログラム例はYDLIDAR X4用に書かれています。

1. Install vcpkg

  1. 以下のコマンドでInstall

    git clone https://github.com/microsoft/vcpkg.git
    cd vcpkg
    .\bootstrap-vcpkg.bat
    
  2. PowerShellを管理者で実行してPATHを通す

    ";C:\path\to\vcpkg"は適宜変更

    [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\path\to\vcpkg", [EnvironmentVariableTarget]::Machine)
    
  3. Pathが通っているか確認

    vcpkg version
    

2. Install CMake

  1. https://cmake.org/download/ からCMakeをDownload

  2. Pathが通っているか確認

    cmake --version
    

3. Build YDLidar-SDK

  1. 以下のコマンドでBuild

    [vcpkgroot]は適宜変更

    git clone https://github.com/YDLIDAR/YDLidar-SDK.git
    cd YDLidar-SDK
    mkdir build
    cd build
    cmake .. "-DCMAKE_TOOLCHAIN_FILE=[vcpkgroot]\scripts\buildsystems\vcpkg.cmake"
    cmake --build . --config Release
    

4. Run tri_test.exe

  1. build/Release/tri_test.exeを実行する

    X4の場合(その他の場合はこちら) :

    Please select the lidar baudrate: 1
    Whether the Lidar is one-way communication[yes/no]:no
    Please enter the lidar scan frequency[5-12]:10
    

5. Run Python

  1. 以下のコマンドでInstall

    cd YDLidar-SDK
    pip install .
    
  2. python/examplesに移動

    cd python/examples
    
  3. Pythonファイルを以下を参考に修正

    これでも動かない場合は自分の力やAIを用いて修正

    • tof_test.py (X4の場合)

      LidarPropSerialBaudrateは適宜変更

      LidarPropLidarTypeは適宜変更

      LidarPropDeviceTypeは適宜変更

      LidarPropScanFrequencyは適宜変更

      LidarPropSampleRateは適宜変更

      LidarPropSingleChannelは適宜変更

      import ydlidar
      import time
      
      if __name__ == "__main__":
          ydlidar.os_init();
          ports = ydlidar.lidarPortList();
          port = "/dev/ydlidar";
          for key, value in ports.items():
              port = value;
          laser = ydlidar.CYdLidar();
          laser.setlidaropt(ydlidar.LidarPropSerialPort, port);
          laser.setlidaropt(ydlidar.LidarPropSerialBaudrate, 128000);
          laser.setlidaropt(ydlidar.LidarPropLidarType, ydlidar.TYPE_TOF);
          laser.setlidaropt(ydlidar.LidarPropDeviceType, ydlidar.YDLIDAR_TYPE_SERIAL);
          laser.setlidaropt(ydlidar.LidarPropScanFrequency, 10.0);
          laser.setlidaropt(ydlidar.LidarPropSampleRate, 5);
          laser.setlidaropt(ydlidar.LidarPropSingleChannel, False);
      
          ret = laser.initialize();
          if ret:
              ret = laser.turnOn();
              scan = ydlidar.LaserScan()
              while ret and ydlidar.os_isOk() :
                  r = laser.doProcessSimple(scan);
                  if r:
                      if scan.config.scan_time > 0:
                          print("Scan received[", scan.stamp, "]:", scan.points.size(), "ranges is [", 1.0 / scan.config.scan_time, "]Hz")
                      else:
                          print("Scan time is zero, skipping frequency calculation.")
                  else:
                      print("Failed to get Lidar Data.")
      
                  time.sleep(0.05);
              laser.turnOff();
          laser.disconnecting();
      
    • plot_tof_test.py (X4の場合)

      LidarPropSerialBaudrateは適宜変更

      LidarPropLidarTypeは適宜変更

      LidarPropDeviceTypeは適宜変更

      LidarPropScanFrequencyは適宜変更

      LidarPropSampleRateは適宜変更

      LidarPropSingleChannelは適宜変更

      LidarPropMaxAngleは適宜変更

      LidarPropMinAngleは適宜変更

      LidarPropMaxRangeは適宜変更

      LidarPropMinRangeは適宜変更

      import ydlidar
      import matplotlib.pyplot as plt
      import matplotlib.animation as animation
      
      RMAX = 32.0
      
      fig = plt.figure()
      fig.canvas.manager.set_window_title('YDLidar LIDAR Monitor')
      
      lidar_polar = plt.subplot(polar=True)
      lidar_polar.autoscale_view(True, True, True)
      lidar_polar.set_rmax(RMAX)
      lidar_polar.grid(True)
      
      ports = ydlidar.lidarPortList()
      port = "/dev/ydlidar"
      for key, value in ports.items():
          port = value
      
      laser = ydlidar.CYdLidar()
      laser.setlidaropt(ydlidar.LidarPropSerialPort, port)
      laser.setlidaropt(ydlidar.LidarPropSerialBaudrate, 128000)
      laser.setlidaropt(ydlidar.LidarPropLidarType, ydlidar.TYPE_TOF)
      laser.setlidaropt(ydlidar.LidarPropDeviceType, ydlidar.YDLIDAR_TYPE_SERIAL)
      laser.setlidaropt(ydlidar.LidarPropScanFrequency, 10.0)
      laser.setlidaropt(ydlidar.LidarPropSampleRate, 5)
      laser.setlidaropt(ydlidar.LidarPropSingleChannel, False)
      laser.setlidaropt(ydlidar.LidarPropMaxAngle, 180.0)
      laser.setlidaropt(ydlidar.LidarPropMinAngle, -180.0)
      laser.setlidaropt(ydlidar.LidarPropMaxRange, 10.0)
      laser.setlidaropt(ydlidar.LidarPropMinRange, 0.12)
      scan = ydlidar.LaserScan()
      
      def animate(num):
          r = laser.doProcessSimple(scan)
          if r:
              angle = []
              ran = []
              intensity = []
              for point in scan.points:
                  angle.append(point.angle)
                  ran.append(point.range)
                  intensity.append(point.intensity)
              lidar_polar.clear()
              lidar_polar.scatter(angle, ran, c=intensity, cmap='hsv', alpha=0.95)
      
      ret = laser.initialize()
      if ret:
          ret = laser.turnOn()
          if ret:
              ani = animation.FuncAnimation(fig, animate, interval=50)
              plt.show()
          laser.turnOff()
      laser.disconnecting()
      plt.close()
      
      
  4. 以下のコマンドで実行

    python tof_test.py
    
    pip install matplotlib # Installしていない場合は
    python plot_tof_test.py
    

Reference

Install and use packages with CMake

GitHub - YDLIDAR/YDLidar-SDK: Driver for receiving YD LiDAR data and more...

Discussion