实验室有一个镭神C16的激光雷达,最近在我这,想拿来玩一玩。本意是做一个实时的检测,通过ROS获取激光雷达的激光点云,用pointpillars模型来进行实时的三维目标检测任务。但是镭神c16这一个激光雷达,不太好处理,目前只能用自带的驱动,进行一个实时的显示。所以下边的思路就是,先存储镭神c16的点云数据,再用ros进行三维目标检测。
文章目录
通过ros来实现点云消息的订阅和检测框bbox消息的发布,来实现一个检测效果的可视化功能。
已经搭建过了OpenPCDet。
已经搭建了ROS环境,我用的是kinetic版本,用其他版本应该也可以。
mkdir -p ~/pointpillars_ros/src
cd pointpillars_ros/src
git clone https://github.com/BIT-DYN/pointpillars_ros
cd ..
# 进入到搭建好的openpcdet环境
conda activate openpcdet
pip install --user rospkg catkin_pkg
pip install pyquaternion
# 因为我用的是kinetic,所以需要安装下边的库,如果是其他版本的ros,下边修改kinetic安装对应版本即可
sudo apt-get install ros-kinetic-pcl-ros
sudo apt-get install ros-kinetic-jsk-recognition-msg
sudo apt-get install ros-kinetic-jsk-rviz-plugins
## 注意,执行catkin_make时,在最外层的文件夹下,也就是我例子中的~/pointpillars_ros
catkin_make
为保险起见,我将下边这些文件全部放入到src/pointpillars/tools文件夹下了。

可以先修改一下demo.py文件的配置文件和预训练模型的位置,测试是否能成功调用pcdet,如果可以的话,说明环境迁移过来后没问题,再尝试修改ros.py的代码。
# 下边的路径改成自己的
sys.path.append("/home/ubuntu/pointpillars_ros/src/pointpillars_ros") # Line 22
# 54行后边
""" Initialize ros parameters """
config_path = rospy.get_param("/config_path", "/home/ubuntu/pointpillars_ros/src/pointpillars_ros/tools/cfgs/kitti_models/pointpillar.yaml")
ckpt_path = rospy.get_param("/ckpt_path", "/home/ubuntu/pointpillars_ros/src/pointpillars_ros/tools/models/pointpillar.pth")
# 订阅的激光点云名字,改成自己的,我用的是kitti的.bag文件
self.sub_velo = rospy.Subscriber("/kitti/velo/pointcloud", PointCloud2, self.lidar_callback, queue_size=1, buff_size=2**12)
修改旋转参数,大概在ros.py的86行前后。我问了开源作者,他们安装的雷达有偏角,所以这里置0就行。
# 旋转轴
#rand_axis = [0,1,0]
#旋转角度
#yaw = 0.1047
#yaw = 0.0
#返回旋转矩阵
#rot_matrix = self.rotate_mat(rand_axis, yaw)
#np_p_rot = np.dot(rot_matrix, np_p[:,:3].T).T
# convert to xyzi point cloud
x = np_p[:, 0].reshape(-1)
y = np_p[:, 1].reshape(-1)
z = np_p[:, 2].reshape(-1)
if np_p.shape[1] == 4: # if intensity field exists
i = np_p[:, 3].reshape(-1)
else:
i = np.zeros((np_p.shape[0], 1)).reshape(-1)
points = np.stack((x, y, z, i)).T
另外ros.py代码中是没有去除掉scores低的检测框,我打印看了一下,如下图所示,置信度为0.107的也没有去除掉:
修改ros.py代码的大概110行前后(去除掉不合适的检测框,我设置的阈值为0.5),如下所示:
# 组装数组字典
input_dict = {
'points': points,
'frame_id': msg.header.frame_id,
}
data_dict = self.demo_dataset.prepare_data(data_dict=input_dict) # 数据预处理
data_dict = self.demo_dataset.collate_batch([data_dict])
load_data_to_gpu(data_dict) # 将数据放到GPU上
pred_dicts, _ = self.model.forward(data_dict) # 模型前向传播
scores = pred_dicts[0]['pred_scores'].detach().cpu().numpy()
mask = scores > 0.5
scores = scores[mask]
boxes_lidar = pred_dicts[0]['pred_boxes'][mask].detach().cpu().numpy()
label = pred_dicts[0]['pred_labels'][mask].detach().cpu().numpy()
num_detections = boxes_lidar.shape[0]
#rospy.loginfo("The num is: %d ", num_detections)
# print(boxes_lidar)
# print(scores)
# print(label)
分析:
以上的代码,订阅了激光点云信息(并在rviz界面展示),发布检测框(并在rviz显示),检测是需要时间的,所以检测框与当前显示帧的点云并不匹配。
思路:
得到检测框结果之后,重新发布当前帧点云信息,名字修改一下。然后在rviz可视化界面选择重新发布的点云就可以了。
在ros.py中添加新发布的点云,在rviz文件中新增新的点云话题。
修改后的代码可查看:
国内gitee地址:https://gitee.com/ximing689/pointpillars_ros
<launch>
# 主要修改下边第一行
<node pkg="rosbag" type="play" name="player" output="log" args="-l /media/ubuntu/ximing/dataset/ros_kitti/bag/2011_10_03/kitti_2011_10_03_drive_0027_synced.bag" />
<node name="pointpillars_ros" type="ros.py" pkg="pointpillars_ros" output="screen"/>
<node type="rviz" name="rviz" pkg="rviz" args="-d $(find pointpillars_ros)/launch/pointpillars.rviz" />
</launch>
主要修改你所用的话题的名字,我改了点云和图像的名字

执行下边的命令
conda activate openpcdet
source ~/pointpillars_ros/devel/setup.bash
roslaunch pointpillars_ros pointpillars.launch
我使用kitti原数据的某一段时间,转成.bag格式,用pointpillars的模型进行测试的,效果也不行,猜测原因可能是1.旋转矩阵参数没有修改;2.激光点云显示的跟检测框有延时,不能很好匹配;3.第三点可能就是模型不行(可能性不大)。


设定阈值之后,明显减少了很多检测框,不过依然存在检测延时(检测框不准)。

初次部署这个代码的时候,检测框跟实际点云完全不匹配,目标框是杂乱的。经过分析,将点云和检测框进行匹配对齐之后,显示的检测效果还是不错的(目前还没做图像的对齐,所以图像和点云显示不一致)。
哔哩哔哩

下图是用雷神c16雷达在实验室采集的30秒的数据,不到1分钟,696MB。

目前用rosbag record存储了一些雷神C16激光雷达的数据,还不太会使用雷达实时读取,实时检测。后期再想办法吧。
非常感谢这些网友分享的开源资料,让一个小白的我,也能快速demo出一个效果。
遇到的问题,解决办法:
视频效果:https://www.bilibili.com/video/BV1ce4y1D76o/
代码地址:https://gitee.com/ximing689/pointpillars_ros
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
我有一个连接到服务器的rubytcpsocket客户端。在发送数据之前如何检查套接字是否已连接?我是否尝试“拯救”断开连接的tcpsocket,重新连接然后重新发送?如果是这样,有没有人有一个简单的代码示例,因为我不知道从哪里开始:(我很自豪我设法在rails中获得了一个持久连接的客户端tcpsocket。然后服务器决定杀死客户端,一切都崩溃了;)编辑我已经使用此代码解决了一些问题-如果未连接,它将尝试重新连接,但如果服务器已关闭则不会处理这种情况(它将继续重试)。这是正确方法的开始吗?谢谢defself.write(data)begin@@my_connection.write(
我在一台Windows764位机器上使用Sass和Ruby(最新版本),我正在我的家庭服务器上处理一个共享文件夹。(但是,我不得不承认问题本身也出现在服务器上,因为我试图安装Ruby并直接-watch服务器上的文件)。问题如下:如果我第一次保存,检测到变化,我的style.css被直接覆盖。之后,我总是需要保存多达7次才能覆盖style.css。每次都会检测到更改,但不会编译任何内容。这是一个屏幕:>>>Sassiswatchingforchanges.PressCtrl-Ctostop.overwritestyle.css>>>Changedetectedto:E:/Websites
我所在的团队负责管理公司面向公众的云平台。我们拥有大量运行面向互联网的VM的用户群。我想对我们的地址空间进行自动扫描,看看是否有人在运行Rails应用程序,这样我就可以通知他们升级他们的Rails版本,以避免本周出现的严重安全漏洞。我注意到在某些Apache部署中,有一个有用的PassengerHeader:X-Powered-By:PhusionPassenger(mod_rails/mod_rack)2.0.3然而,这并不可靠。我想知道是否有一种可靠的方法来检测在Web服务器后面运行的Rails,无论是使用响应header还是某种可以确定的GET/POST。谢谢!