Astra Pro camera configuration and use
基于OPENNI2的开发环境配置
OpenNI2简介
OpenNI 中文译为开放自然语言交互,用官方的表述来讲就是 a standard framework for 3D sensing,用于3D感知的开发接口。
OpenNI2 是第二代版本,相对于第一代更加专注于对3D设备的支持和数据的获取,移除了手势识别等中间件的方式,代码更加的精简,简而言之 OpenNI2 就是一个RGBD相机的用户态驱动,对上提供统一的接口,方便用户获取RGBD的图像数据,对下提供统一的标准类,方便RGBD厂商进行适配。
目前 OpenNI2 支持的设备包括 PS1080、PSLink、orbbec、Kinect 等设备,由于其清晰的代码结构,很容易对第三方设备进行适配。
OpenNI2 的源码地址为:https://github.com/OpenNI/OpenNI2
PrimeSense 是 Kinect 一代的芯片供应商,位于以色列,也是开源体感开发包 OpenNI 的维护者。自从被 Apple 收购后,销声匿迹,OpenNI 也停止更新。
现在可以从网站http://structure.io/openni下载到 OpenNI 2 SDK 和文档。
下载OpenNI2
注: 奥比中光官方网站下载的 OpenNI 2 文件以及在 structure.io 或 PCL 等官方网站上下载的 OpenNI 的对应文件中都缺少相应的所需文件如 orbbec.dll 和 orbbec.ini 等等
这里选择在Universal Download Thread for Astra Series Cameras下载 OpenNI 2 for Linux,这个网站在国外,下载链接可能打不开,可以科学上网进行下载,注意要根据系统信息选择合适的驱动
以 Linux-x64 为例
安装配置及示例程序测试
-
解压下载的 OpenNI 包
1
unzip OpenNI-Linux-x64-2.3
-
解压完成后,给安装文件
install.sh
加上可执行权限1
sudo chmod a+x install.sh
-
运行安装脚本,可以产生
OpenNIDevEnvironment
,其中包含了 OpenNI 的开发环境1
sudo ./install.sh
-
添加环境变量,OpenNI 要依据一些环境变量来定位文件
1
source OpenNIDevEnvironment
-
要运行带图形界面的示例程序(比如 SimpeViewer),需要额外安装 freeGLUT 库。如果只是运行命令行程序(如 SimpleRead),则不必安装
1 2
# To run visual samples(e.g., SimpleViewer), you will need freeglut3 header and libaries, please install: sudo apt-get install build-essential freeglut3 freeglut3-dev
-
编译示例文件
1 2
cd Samples/SimpleViewer make
编译make时可能会报错如下:
error: ‘char* __builtin_strncpy(char*, const char*, long unsigned int)’ specified bound 256 equals destination size [-Werror=stringop-truncation]
该错误的关键在于
[-Werror=stringop-truncation]
,这是gcc把警告当成错误造成的,该问题在使用gcc8.0以上的编译器时会出现,因为gcc在8.0之后的版本加入了 stringop truncation 的验证警告解决办法:
直接修改源码
Viewer.cpp
找到调用报错函数 strncpy(…) 的位置,在下方添加一行代码,将相应容器的最后一位手动设置为结束符'\0',如下:
第二种修改方式是将 strncpy 中长度改为小于目标缓冲区边界值,即将 length 调整为 sizeof(buf) -1,修改后如下:
重新编译通过:
-
插入相机,可通过
lsusb
命令查看是否检测到相机 -
运行示例程序
1 2
cd Bin/x64-Release/ ./SimpleViewer
如果一切顺利,应该获得如下图所示效果:
如果运行时显示找不到设备
no devices found
,如下所示:原因:没有正确安装驱动,之前
sudo ./install.sh
只是安装了安装驱动所需的 udev 文件,但实际上并没有安装驱动,因此 OpenNI2 在调用相关API时,就找不到深度相机。解决方法:将
Redist
中包含的 Astra-pro 驱动相关文件拷贝到 OpenNI2 的指定位置,这样 OpenNI2 就能正确识别出深度相机了,具体指令如下:1 2 3 4
# 当前目录为 OpenNI2/OpenNI-Linux-x64-2.3 sudo cp ./Redist/OpenNI2/Drivers/* /usr/lib/OpenNI2/Drivers sudo cp ./Redist/libOpenNI2.* /usr/lib sudo cp -r Include/ /usr/include/openni2
基于ros的开发环境配置
安装依赖
|
|
安装 libuvc
|
|
新建ros工作空间
|
|
下载代码
|
|
编译
|
|
编译可能出现问题
如果编译报错:
-
出现错误
1 2 3 4
[ 98%] Built target astra_camera_node /usr/bin/ld: CMakeFiles/camera_node.dir/src/libuvc_camera/camera_driver.cpp.o: in function `libuvc_camera::CameraDriver::~CameraDriver()': camera_driver.cpp:(.text+0xcb4): undefined reference to `uvc_free_frame' /usr/bin/ld: camera_driver.cpp:(.text+0xcd4): undefined reference to `uvc_exi
主要原因是找不到相应的库,在 ros_astra_camera 的 CMakeList.txt 中
find_package(libuvc REQUIRED)
下方添加语句:1 2
set(libuvc_INCLUDE_DIRS "/usr/local/include/libuvc") set(libuvc_LIBRARIES "/usr/local/lib/libuvc.so")
libuvc 的路径根据自己的安装位置进行更改。
-
出现错误
'nullptr' was not declared in this scope
在 ros_astra_camera 的 CMakeList.txt 中添加:
1
add_definitions(-std=c++11)
更新设备管理选项
|
|
命令执行完成后可以在/etc/udev/rules.d/
查看是否有orbbec-usb.rules
文件,如果文件里没有对应的设备号,可以根据自己的id号来更新设备管理选项:即修改 ATTR{idProduct}
和 ATTR{idVendor}
项值即可。
此处可以使用lsusb
来查看自己的相机在设备列表中的id号,例如:
再看对应orbbec-usb.rules
文件
注:其中2bc5:0403是深度模块,2bc5:0502是RGB模块。
重启服务
|
|
修改launch文件内容
在 ros_astra_camera/launch 文件下修改 astrapro.launch 文件
因为astra pro相机的RGB模块是 0501,因此需要将 product 参数的值修改为 0x0501,不然不能显示RGB图像。
启动相机
|
|
启动后在pc上打开 rviz,添加 image 组件,
通过订阅 /camera/rgb/image_raw
可以获得RGB图像信息,
通过订阅 /camera/depth/image
可以获得深度图像信息,
订阅 /camera/ir/image
可以获得红外信息
官方提供了点云ros包 astra_visual
运行 astra_visual 包内的 pointCloud_pub.launch
,并在 rviz 中添加 pointCloud2 组件订阅主题
|
|
即可看到 rviz 中间有一团点云在闪动,查看源码即可看到点云生成过程
运行可能出现问题
-
报权限错误,并且出现获取不到设备的警告时,需要检测是否可以识别 video0 设备以及 usb 设备,可以给摄像头读写权限:
1
sudo chmod 777 /dev/bus/usb/002/*
-
如果出现 process has died 的错误:
- 请确保当前只有一个使用相机的程序在运行,可以查看后台程序,查找是否之前已经开启过相机程序
- 如果是在虚拟机进行运行的话,调整USB兼容性为 USB 3.1