ubuntu20.04 ROS 环境下使用 Flir Blackfly S 工业相机

本文介绍了如何在Ubuntu20.04 ROS环境中配置并使用Flir BlackflyS USB3工业相机。内容涵盖Spinnaker SDK安装、驱动配置、带宽调整等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flir Blackfly 官网:网址
Spinnaker C++ API 网址

Flir Blackfly S USB3 产品介绍

Blackfly S 采用业内先进的冰块外形传感器。
具有强大功能,可以轻松生成所需的精确图像,并加速应用程序开发。
包括对图像捕获和相机预处理的自动和精确手动控制
Blackfly S 提供GigE、USB3、套装和板级版本。
精确图像 索尼CMOS传感器中的选择包括:全局快门、偏振和高灵敏度BSI传感器。

实物图如下:
在这里插入图片描述
使用的型号为:BFS-U3-16S2C-CS

其主要参数如下:
在这里插入图片描述

安装 Spinnaker

Spinnaker SDK的下载地址:
地址

但是只能找到2.x版本的

Spinnaker2及以上,安装后不再系统include文件夹中添加头文件,影响驱动“”对文件的索引。

注意安装完毕后,文件是在 /opt 文件夹中

如果用 flir_adk_ethernet 功能包 怎会出现 找不到头文件的情况。 如果能找到 Spinnaker1.x 版本的,这个功能包则可以用。

安装Spinnaker 在下载的文件夹找到install_spinnaker.sh这个文件,然后在其路径下打开终端,输入

sudo sh install_spinnaker.sh

安装提示安装即可。

安装 spinnaker_sdk_camera_driver 功能包

由于安装的 2.x版本的 Spinnaker 所以 最好 选择 这个功能包 ,省去配置路径的很多麻烦。

该功能包对于 x86_64 的电脑 需要 安装如下依赖

  • unwind-dev
  • ros-noetic-cv-bridge
  • ros-noetic-image-transport

通过如下指令安装 依赖

sudo apt install libunwind-dev ros-noetic-cv-bridge ros-noetic-image-transport

从github上下载功能包

git clone https://github.com/neufieldrobotics/spinnaker_camera_driver.git

放到ros的工作空间编译

catkin_make

好了,如果是 ubuntu 18.04 之前的版本应该没问题

但是我的是 ubuntu 20.04 版本的,编译报错了

提示 ,在 std_include.h 文件中找不到 cv.h文件

原因就是 ubuntu 20.04 的opencv版本是 v4的,版本不匹配造成的。

此时需要对功能包源码进行一定修改

打开 std_include.h 文件,删掉 第 9行

9  -  #include <cv.h>

打开 capture.cpp 文件 ,修改 第 1000 行

if (LIVE_)namedWindow("Acquisition", CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO);
if (LIVE_)namedWindow("Acquisition", WINDOW_NORMAL | WINDOW_KEEPRATIO);

将上面的改为下面的

修改 第 1049 行

int key = cvWaitKey(1);
int key = waitKey(1);

将上面的改为下面的

修改 第 1073 行

cvDestroyAllWindows();
destroyAllWindows();

将上面的改为下面的

修改 第 1101 行

cvDestroyAllWindows();
destroyAllWindows();

将上面的改为下面的

然后再编译即可成功!

增加USB3.0的带宽限制

默认的,在Linux系统中,USB-FS 仅有16MB的带宽对于所有的USB设备。对于高帧率相机来说这个带宽就太少了,并且如果相机的分辨率很高,或者同时接多个相机,那么都需要增大其带宽限制。

在安装 Spinnaker 的时候 会 自动的 设置 带宽。 如果想确定成功没有,可以打开 /etc/rc.local文件,如果没有这个文件,肯定没有设置成功。
有这个文件的话,打开,看最后有没有下面这句话:

sh -c 'echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb'

如果有,那么设置应该成功了。还可以通过如下指令查看

cat /sys/module/usbcore/parameters/usbfs_memory_mb

设置成功,终端如下:
在这里插入图片描述
如果没有成功,可以执行

sudo sh configure_usbfs.sh

这个脚本。

也可以手动设置这个带宽,方法如下:
首先 添加 rc.local 文件,并附权

        $ sudo touch /etc/rc.local
        $ sudo chmod 744 /etc/rc.local

在最后添加下面这个句

sh -c 'echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb'

然后保存,重启设备。用上面的检测方法检查下,失败的话用下面的

$ sudo sh -c 'echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb'

如果用多个相机的话,那么可能要超过1000

硬件连接

在这里插入图片描述

修改相机id号

相机本身自己有一个8位的id号,在相机的下部。这个id号要填到 test_params.yaml 文件中

cam_ids:
master_cam:

改这两个值

启动驱动

roslaunch spinnaker_sdk_camera_driver acquisition.launch

然后可以查看当前 消息 名称

rostopic list

在这里插入图片描述

/camera_array/cam0/image_raw 就是图像的消息

rostopic hz /camera_array/cam0/image_raw

可以查看其频率
在这里插入图片描述

rviz查看图像

启动rviz

rviz

添加 image 功能菜单,然后Image Topic 选择/camera_array/cam0/image_raw

即可出现画面,如下:
在这里插入图片描述

### 配置 FLIR BlackFly 相机驱动及 SDK 的方法 要在 Ubuntu 20.04 上成功配置并使用 FLIR BlackFly 相机,需按照以下说明操作: #### 开发环境准备 确保安装了必要的依赖项以及工具链。可以通过以下命令完成基础环境的搭建: ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential cmake pkg-config libusb-1.0-0-dev git python3-catkin-tools -y ``` 创建一个新的 Catkin 工作空间来管理 Spinnaker SDK 和其对应的 ROS 软件包。 ```bash mkdir -p ~/spinnaker_ws/src cd ~/spinnaker_ws/src git clone https://github.com/neufieldrobotics/spinnaker_sdk_camera_driver.git ``` 编译工作区内的软件包以构建驱动程序支持。 ```bash cd ~/spinnaker_ws/ catkin_make source ~/spinnaker_ws/devel/setup.bash ``` 上述过程会下载、编译由 Neufield Robotics 维护的一个兼容于 FLIR 相机系列的开源驱动器[^3]。 #### 安装 Spinnaker SDK 官方推荐的方式是从 FLIR 提供的二进制文件直接安装 Spinnaker SDK 。访问 [FLIR 下载页面](https://www.flir.com/products/spinnaker-sdk/) 获取最新版本,并遵循这些步骤进行本地部署: 1. **下载与解压**: 将 `.run` 文件保存到计算机上任意目录 (例如 `/home/user/Downloads`) 并赋予可执行权限。 ```bash chmod +x /path/to/Spinnaker*.run ``` 2. **运行安装脚本**: ```bash ./Spinnaker*.run --target /opt/flir/spinnaker ``` 3. **设置环境变量**: 编辑 `~/.bashrc` 或者当前终端 session 中临时加载路径以便让系统识别库位置。 ```bash echo 'export SPINNAKER_ROOT=/opt/flir/spinnaker' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$SPINNAKER_ROOT/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` 此时应该已经具备完整的硬件接口层能力用于控制相机设备。 #### 测试连接状态 为了验证摄像头是否被正确检测到, 可利用 Spinnaker 自带的应用程序或者编写简单的测试代码来进行初步确认。 通过 Python API 实现基本读取帧数逻辑如下所示: ```python import PySpin def acquire_images(cam): try: nodemap_tldevice = cam.GetTLDeviceNodeMap() result = True node_device_serial_number = PySpin.CStringPtr(nodemap_tldevice.GetNode('DeviceSerialNumber')) if PySpin.IsAvailable(node_device_serial_number) and PySpin.IsReadable(node_device_serial_number): device_serial_number = node_device_serial_number.GetValue() print(f'\nCamera {device_serial_number} initialized...') cam.Init() # Set acquisition mode to continuous nodemap = cam.GetNodeMap() node_acquisition_mode = PySpin.CEnumerationPtr(nodemap.GetNode('AcquisitionMode')) if not PySpin.IsAvailable(node_acquisition_mode) or not PySpin.IsWritable(node_acquisition_mode): print('Unable to set acquisition mode to continuous') return False node_acquisition_mode_continuous = node_acquisition_mode.GetEntryByName('Continuous') if not PySpin.IsAvailable(node_acquisition_mode_continuous) or not PySpin.IsReadable(node_acquisition_mode_continuous): print('Unable to set acquisition mode to continuous') return False acquisition_mode_continuous = node_acquisition_mode_continuous.GetValue() node_acquisition_mode.SetIntValue(acquisition_mode_continuous) cam.BeginAcquisition() image_result = cam.GetNextImage(1000) width = image_resultGetWidth() height = image_resultGetHeight() print(f'Grabbed Image {width} x {height}') image_converted = image_result.Convert(PySpin.PixelFormat_Mono8, PySpin.HQ_LINEAR) filename = f'{device_serial_number}.jpg' image_converted.Save(filename) print(f'Saved as {filename}') image_result.Release() print('Released image.') cam.EndAcquisition() except PySpin.SpinnakerException as ex: print(f'Error: {ex}') return False return result if __name__ == '__main__': system = PySpin.System.GetInstance() cam_list = system.GetCameras() num_cameras = cam_list.GetSize() print(f'Detected {num_cameras} camera(s).') for i, cam in enumerate(cam_list): print(f'Testing Camera #{i+1}: ') test_result = acquire_images(cam) if not test_result: break del cam cam_list.Clear() system.ReleaseInstance() ``` 此段脚本展示了如何初始化一台已连接至主机系统的 GigE Vision 设备,并尝试获取单张图片存储为 JPEG 格式的文件[^2]。 --- ### 注意事项 如果遇到任何错误消息提示无法找到某些动态链接库 (.so),则可能是因为缺少特定架构下的依赖关系或者是未刷新共享对象缓存所致;解决办法包括重新启动机器或是手动更新 ldconfig 数据表: ```bash sudo ldconfig ``` 另外,在多台网络摄像机组网场景下需要注意 IP 地址冲突问题以及其他潜在干扰因素影响正常通讯质量[^1]。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月照银海似蛟龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值