https://github.com/nesnes/YDLidarX2_python/tree/master
https://www.ydlidar.cn/service_support/download.html
https://www.ydlidar.cn/Public/upload/files/2024-02-01/YDLIDAR%20X2%20%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%20V1.1(240124).pdf
https://kaia.ai/blog/arduino-lidar-library/
http://www.360doc.com/content/24/0605/19/36367108_1125416391.shtml
https://www.ydlidar.cn/Public/upload/files/2024-02-01/YDLIDAR%20X2%20%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%20V1.3(240124).pdf
https://www.ydlidar.cn/products/view/6.html
https://kaia.ai/blog/tutorial-connect-ld14p-lidar/
注意实物图的线颜色可能对不上,按照顺序
我手上的地线和RX是反着的
https://www.ydlidar.cn/service_support/download.html?gid=6
烧录时候 需要按着boot按键,结束后松开,按下reset按键
// Copyright 2023-2024 KAIA.AI // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef ESP32 #error This example runs on ESP32 #endif #include <LDS_YDLIDAR_X2_X2L.h> const uint8_t LIDAR_EN_PIN = 19; // ESP32 Dev Kit LiDAR enable pin const uint8_t LIDAR_PWM_PIN = 15; // LiDAR motor speed control using PWM const uint8_t LIDAR_TX_PIN = 17; const uint8_t LIDAR_RX_PIN = 16; #define LIDAR_PWM_FREQ 10000 #define LIDAR_PWM_BITS 11 #define LIDAR_PWM_CHANNEL 2 // ESP32 PWM channel for LiDAR motor speed control HardwareSerial LidarSerial(1); LDS_YDLIDAR_X2_X2L lidar; void setup() { Serial.begin(115200); Serial.print("LiDAR model "); Serial.println(lidar.getModelName()); Serial.print("LiDAR RX buffer size "); // default 128 hw + 256 sw Serial.print(LidarSerial.setRxBufferSize(1024)); // must be before .begin() uint32_t baud_rate = lidar.getSerialBaudRate(); Serial.print(", baud rate "); Serial.println(baud_rate); LidarSerial.begin(baud_rate, SERIAL_8N1, LIDAR_RX_PIN, LIDAR_TX_PIN); lidar.setScanPointCallback(lidar_scan_point_callback); lidar.setPacketCallback(lidar_packet_callback); lidar.setSerialWriteCallback(lidar_serial_write_callback); lidar.setSerialReadCallback(lidar_serial_read_callback); lidar.setMotorPinCallback(lidar_motor_pin_callback); lidar.init(); LDS::result_t result = lidar.start(); Serial.print("LiDAR start() result: "); Serial.println(lidar.resultCodeToString(result)); if (result < 0) Serial.println("Is the LiDAR connected to ESP32?"); } int lidar_serial_read_callback() { return LidarSerial.read(); // int ch = LidarSerial.read(); // if (ch != -1) // Serial.println(ch); // return ch; } size_t lidar_serial_write_callback(const uint8_t * buffer, size_t length) { return LidarSerial.write(buffer, length); } void lidar_scan_point_callback(float angle_deg, float distance_mm, float quality, bool scan_completed) { static int i=0; if (i % 20 == 0) { Serial.print(i); Serial.print(' '); Serial.print(distance_mm); Serial.print(' '); Serial.println(angle_deg); } i++; if (scan_completed) { i = 0; Serial.print("========== 扫描结束 ===== Scan completed; ==== RPM 转速 圈/秒 "); Serial.println(lidar.getCurrentScanFreqHz()); } } void lidar_info_callback(LDS::info_t code, String info) { Serial.print("LiDAR info "); Serial.print(lidar.infoCodeToString(code)); Serial.print(": "); Serial.println(info); } void lidar_error_callback(LDS::result_t code, String aux_info) { Serial.print("LiDAR error "); Serial.print(lidar.resultCodeToString(code)); Serial.print(": "); Serial.println(aux_info); } void lidar_motor_pin_callback(float value, LDS::lds_pin_t lidar_pin) { int pin = (lidar_pin == LDS::LDS_MOTOR_EN_PIN) ? LIDAR_EN_PIN : LIDAR_PWM_PIN; if (value <= (float)LDS::DIR_INPUT) { // Configure pin direction if (value == (float)LDS::DIR_OUTPUT_PWM) { #if ESP_IDF_VERSION_MAJOR < 5 ledcSetup(LIDAR_PWM_CHANNEL, LIDAR_PWM_FREQ, LIDAR_PWM_BITS); ledcAttachPin(pin, LIDAR_PWM_CHANNEL); #else ledcAttachChannel(pin, LIDAR_PWM_FREQ, LIDAR_PWM_BITS, LIDAR_PWM_CHANNEL); #endif } else pinMode(pin, (value == (float)LDS::DIR_INPUT) ? INPUT : OUTPUT); return; } if (value < (float)LDS::VALUE_PWM) // set constant output digitalWrite(pin, (value == (float)LDS::VALUE_HIGH) ? HIGH : LOW); else { // Set PWM duty cycle int pwm_value = ((1<<LIDAR_PWM_BITS)-1)*value; #if ESP_IDF_VERSION_MAJOR < 5 ledcWrite(LIDAR_PWM_CHANNEL, pwm_value); #else ledcWriteChannel(LIDAR_PWM_CHANNEL, pwm_value); #endif } } void lidar_packet_callback(uint8_t * packet, uint16_t length, bool scan_completed) { return; } void loop() { lidar.loop(); }
可视化代码
python38
import multiprocessing from multiprocessing import Process,Manager import serial import time import matplotlib.pyplot as plt import math import numpy as np # 串口解析进程 def serial_parser(queue, port, baudrate): ser = serial.Serial(port, baudrate, timeout=1) print(f"Connected to {port} at {baudrate} baudrate.") while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').strip() #line = ser.readline().decode().strip() #print(line) if line: try: #index, distance, angle = map(float, line.split(' ')) data = line.split() if len(data) == 3: index = int(data[0]) distance = float(data[1]) # 单位:毫米 angle = float(data[2]) # 单位:度 #distance_cm = distance / 10 # 转化为cm #angle_rad = np.deg2rad(angle) # 转化为弧度 queue.put((index, distance, angle)) except ValueError: print(f"Invalid data: {line}") from matplotlib.patches import Circle # 数据可视化进程 def data_visualizer(queue): plt.ion() # 开启交互模式 fig, ax = plt.subplots() ax.set_xlim(-8000, 8000) ax.set_ylim(-8000, 8000) ax.set_aspect('equal') # 保持比例,确保圆是圆形而不是椭圆 plt.xlabel("X (mm)") plt.ylabel("Y (mm)") plt.title("Radar Data Visualization") # 绘制多个圆,直到最大半径为 8000 毫米 max_radius_mm = 8000 # 8 米 = 8000 毫米 radius_increment = 500 # 半径增量,0.5 米 = 500 毫米 circles = [] # 存储所有的圆形 for radius in range(radius_increment, max_radius_mm + 1, radius_increment): circle = Circle((0, 0), radius, color='b', fill=False) # 绘制圆形,不填充 ax.add_patch(circle) circles.append(circle) # 绘制两条直线,经过(0, 0) ax.plot([-max_radius_mm, max_radius_mm], [0, 0], 'r--', label="X-axis") # 红色水平直线 ax.plot([0, 0], [-max_radius_mm, max_radius_mm], 'g--', label="Y-axis") # 绿色垂直直线 # 初始化空的散点图 scatter = ax.scatter([], [], s=3, c=[], cmap='hsv', vmin=0, vmax=8000) # 使用hsv颜色映射 plt.colorbar(scatter, label="Distance (mm)") # 添加颜色条 # 存储数据点 x_points = [] y_points = [] colors = [] while True: if not queue.empty(): index, distance, angle = queue.get() if distance == 0 or distance > 8000: print("skip", index, distance, angle) continue # 如果 index 为 0,表示新的一圈开始,清空上一圈的数据 if index == 0: x_points.clear() y_points.clear() colors.clear() scatter.set_offsets(np.empty((0, 2))) # 清空散点图 scatter.set_array(np.empty(0)) # 清空颜色数组 # 将极坐标转换为笛卡尔坐标 angle_rad = math.radians(angle) x = distance * math.cos(angle_rad) y = distance * math.sin(angle_rad) # 更新散点图数据 new_offsets = np.column_stack((x, y)) # 新的点 new_colors = np.array(distance) # 新的颜色值 scatter.set_offsets(np.vstack([scatter.get_offsets(), new_offsets])) scatter.set_array(np.hstack([scatter.get_array(), new_colors])) # 动态更新画布 fig.canvas.draw_idle() # 优化更新画布 fig.canvas.flush_events() else: time.sleep(0.01) # 增加短时间的等待,避免占用过多 CPU 资源 if __name__ == "__main__": # 创建进程间通信的队列 queue = multiprocessing.Queue() # 串口配置 port = 'COM4' # 根据你的系统修改串口 baudrate = 115200 # 创建并启动串口解析进程 parser_process = multiprocessing.Process(target=serial_parser, args=(queue, port, baudrate)) parser_process.daemon=True parser_process.start() # 创建并启动数据可视化进程 visualizer_process = multiprocessing.Process(target=data_visualizer, args=(queue,)) visualizer_process.daemon=True visualizer_process.start() # parser_process.join() # visualizer_process.join() # 等待进程结束 while True: time.sleep(10) print("主函数运行中")
https://www.ydlidar.cn/Public/upload/files/2024-02-01/YDLIDAR%20X2%20%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%20V1.3(240124).pdf
3 LINUX 下基于 ROS 的使用操作 Linux 发行版本有很多,本文仅以 Ubuntu18.04、Melodic 版本 ROS 为例。
SDK 驱动程序地址: https://github.com/YDLIDAR/YDLidar-SDK
ROS 驱动程序地址: https://github.com/YDLIDAR/ydlidar_ros_driver
git clone https://github.com/YDLIDAR/YDLidar-SDK.git
3.1 设备连接 Linux 下,X2 雷达和 PC 互连过程和 Windows 下操作一致,参见 Window 下的设备连接。 3.2 编译并安装 YDLidar-SDK ydlidar_ros_driver 取决于 YDLidar-SDK 库。如果您从未安装过 YDLidar-SDK 库,或者 它已过期,则必须首先安装 YDLidar-SDK 库。如果您安装了最新版本的 YDLidar-SDK,请跳 过此步骤,然后转到下一步。 3.3 ROS 驱动包安装 1) 克隆 github 的 ydlidar_ros_driver 软件包: 2) 构建 ydlidar_ros_driver 软件包: 3) 软件包环境设置: &amp;amp;amp;lt;span style="display: inline-block; position: relative; width: 28.036em; height: 0px; font-size: 120%;"&amp;amp;amp;gt;&amp;amp;amp;lt;span style="position: absolute; clip: rect(1.214em, 1028.01em, 2.571em, -1000em); top: -2.143em; left: 0em;"&amp;amp;amp;gt;&amp;amp;amp;lt;span id="MathJax-Span-2" class="mrow"&amp;amp;amp;gt;&amp;amp;amp;lt;span id="MathJax-Span-3" class="mi" style="font-family: MathJax_Math-italic;"&amp;amp;amp;gt;gitclonehttps://github.com/YDLIDAR/YDLidar−SDK.gitgitclonehttps://github.com/YDLIDAR/YDLidar−SDK.git cd YDLidar-SDK/build &amp;amp;amp;lt;span style="display: inline-block; position: relative; width: 3.571em; height: 0px; font-size: 120%;"&amp;amp;amp;gt;&amp;amp;amp;lt;span style="position: absolute; clip: rect(1.27em, 1003.49em, 2.332em, -1000em); top: -2.143em; left: 0em;"&amp;amp;amp;gt;&amp;amp;amp;lt;span id="MathJax-Span-62" class="mrow"&amp;amp;amp;gt;&amp;amp;amp;lt;span id="MathJax-Span-63" class="mi" style="font-family: MathJax_Math-italic;"&amp;amp;amp;gt;cmake..cmake.. make $ sudo make install
https://github.com/kaiaai/LDS
店内雷达资料 https://pan.baidu.com/s/1OBo9Hb-
p27OedYQgK1U8pQ?pwd=8jme 提取码: 8jme
也欢迎喜欢研究模型diy雷达研究的可以加Q群955245396一起交流学习
https://github.com/YDLIDAR/YDLidar-SDK
弹出教程 直接关闭
开始
https://item.taobao.com/item.htm?_u=21qf7bf58629&id=757229568067&pisk=gloz68voF3KzPGMZGcqFbjdn6AZ84kR6tDNQKvD3F7VkJ8thYvkgdLdpeqynOjppeuM3TXlbMMwByBIEgbMiPzGIPW23ijD5VWt88Xks6XsB24whYjML-XiEpMynKXp8OLLjeYELxCO_YhM-evmGsliz-ibmHJIhqEalznkWhCO6fH7cXSOe1btqQe60QRq3Ey23oKyUQTq3-8DD3J2CZwjotKk0MR2hZkj3ni28d6qhq8f0oJyPrwj3xZf0MJq3tXqH3oDEcbhd1R4kKKhzmZASxzPiESSZH0wl3WxTGMqjD8UrxAV2hKi4UzPgkLouf0cjK0i8kC5gvxgZT2cp5ZErK4quCYKP0lDolDyjAp_UZbnqn0UVBGEErbu3Wq-OWz4Uaqmuu9jnHouqt2lyaaFoPjzTnrXeX-G_iYnoupCmEfNzq-4Xjdk0-qi8W0Oc4l0tFugn9F_Y4v0u0glA9-j4iD3PtwzuH-P63Koafd7Wzx-zWwQLoP241LUhJwUoX-P6nTbdJzQu359kj&spm=a1z09.2.0.0.a4352e8dpWT2yn
通过百度网盘分享的文件:杉川修改版Del....zip
链接:https://pan.baidu.com/s/1fiRw2BpLhaQ2P0M56bC6uA
提取码:6A6F
复制这段内容打开「百度网盘APP 即可获取」
通过网盘分享的文件:杉川修改版Delta-2A.zip
链接: https://pan.baidu.com/s/1dF-OkTxnxJ1XZw1VRQIQnw?pwd=neku 提取码: neku
--来自百度网盘超级会员v5的分享
电机和雷达连个电源都要接