Contents

Astra Pro camera configuration and use

/images/2022-11-23-Astra-Pro相机配置及使用/1

基于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.dllorbbec.ini 等等

这里选择在Universal Download Thread for Astra Series Cameras下载 OpenNI 2 for Linux,这个网站在国外,下载链接可能打不开,可以科学上网进行下载,注意要根据系统信息选择合适的驱动

/images/2022-11-23-Astra-Pro相机配置及使用/2

/images/2022-11-23-Astra-Pro相机配置及使用/3

以 Linux-x64 为例

安装配置及示例程序测试

  1. 解压下载的 OpenNI 包

    1
    
    unzip OpenNI-Linux-x64-2.3
    
  2. 解压完成后,给安装文件install.sh加上可执行权限

    1
    
    sudo chmod a+x install.sh
    
  3. 运行安装脚本,可以产生OpenNIDevEnvironment,其中包含了 OpenNI 的开发环境

    1
    
    sudo ./install.sh
    

    /images/2022-11-23-Astra-Pro相机配置及使用/4

  4. 添加环境变量,OpenNI 要依据一些环境变量来定位文件

    1
    
    source OpenNIDevEnvironment
    
  5. 要运行带图形界面的示例程序(比如 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 
    
  6. 编译示例文件

    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]

    /images/2022-11-23-Astra-Pro相机配置及使用/5

    该错误的关键在于[-Werror=stringop-truncation],这是gcc把警告当成错误造成的,该问题在使用gcc8.0以上的编译器时会出现,因为gcc在8.0之后的版本加入了 stringop truncation 的验证警告

    解决办法:

    直接修改源码 Viewer.cpp

    找到调用报错函数 strncpy(…) 的位置,在下方添加一行代码,将相应容器的最后一位手动设置为结束符'\0',如下:

    /images/2022-11-23-Astra-Pro相机配置及使用/6

    第二种修改方式是将 strncpy 中长度改为小于目标缓冲区边界值,即将 length 调整为 sizeof(buf) -1,修改后如下:

    /images/2022-11-23-Astra-Pro相机配置及使用/7

    重新编译通过:

    /images/2022-11-23-Astra-Pro相机配置及使用/8

  7. 插入相机,可通过lsusb命令查看是否检测到相机

  8. 运行示例程序

    1
    2
    
    cd Bin/x64-Release/
    ./SimpleViewer
    

    如果一切顺利,应该获得如下图所示效果:

    /images/2022-11-23-Astra-Pro相机配置及使用/9

    如果运行时显示找不到设备 no devices found,如下所示:

    /images/2022-11-23-Astra-Pro相机配置及使用/10

    原因:没有正确安装驱动,之前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的开发环境配置

安装依赖

1
sudo apt install ros-$ROS_DISTRO-rgbd-launch ros-$ROS_DISTRO-libuvc ros-$ROS_DISTRO-libuvc-camera ros-$ROS_DISTRO-libuvc-ros

可能出现问题

安装 libuvc-ros 时会出现找不到相关依赖,从github上clone下 libuvc,按照 Readme 操作,手动安装 libuvc-ros

1
git clone https://github.com/libuvc/libuvc

新建ros工作空间

1
2
3
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make

下载代码

1
2
cd ~/catkin_ws/src
git clone https://github.com/orbbec/ros_astra_camera

注意:下载下来的功能包并不叫 ros_astra_camera,功能包名称为 astra_camera,如需更改包名,请更改package.xmlCMakeList.txt里的<name>标签,此代码没有标定文件,需要自行标定。

更新设备管理选项

1
2
roscd astra_camera sudo sh
./scripts/create_udev_rules

命令执行完成后可以在/etc/udev/rules.d/查看是否有orbbec-usb.rules文件,如果文件里没有对应的设备号,可以根据自己的id号来更新设备管理选项:即修改 ATTR{idProduct}ATTR{idVendor} 项值即可。

此处可以使用lsusb来查看自己的相机在设备列表中的id号,例如:

/images/2022-11-23-Astra-Pro相机配置及使用/11

再看对应orbbec-usb.rules文件

/images/2022-11-23-Astra-Pro相机配置及使用/12

/images/2022-11-23-Astra-Pro相机配置及使用/13

重启服务

1
2
sudo service udev reload
sudo service udev restart

编译

1
2
cd ~/catkin_ws
catkin_make --pkg astra_camera

可能出现问题

如果编译报错:

  1. 出现错误

    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 中添加语句:

    1
    2
    3
    
    find_package(libuvc REQUIRED)
    set(libuvc_INCLUDE_DIRS "/usr/local/include/libuvc")
    set(libuvc_LIBRARIES "/usr/local/lib/libuvc.so")
    

    libuvc 的路径根据自己的安装位置进行更改。

  2. 出现错误 'nullptr' was not declared in this scope

    在 ros_astra_camera 的 CMakeList.txt 中添加:

    1
    
    add_definitions(-std=c++11)
    

修改launch文件内容

因为是 Astra pro 相机,要运行 astrapro.launch 文件,所以修改 astrapro.launch 文件:

/images/2022-11-23-Astra-Pro相机配置及使用/14

注意 uvc_product_id 的value必须是自己设备的id,lsusb命令显示设备为 0501,因此需要将 product 参数的值修改为 0x0501

启动launch文件

1
2
source ~/catkin_ws/devel/setup.bash
roslaunch astra_camera astrapro.launch

/images/2022-11-23-Astra-Pro相机配置及使用/15

/images/2022-11-23-Astra-Pro相机配置及使用/16

/images/2022-11-23-Astra-Pro相机配置及使用/17

启动后在从机pc上打开 rviz,添加 image 组件,通过订阅/camera/color/image_raw可以获得rgb图像信息,通过订阅/camera/depth/image_raw可以获得深度图像信息,订阅/camera/ir/image_raw可以获得红外信息

/images/2022-11-23-Astra-Pro相机配置及使用/18

/images/2022-11-23-Astra-Pro相机配置及使用/19

/images/2022-11-23-Astra-Pro相机配置及使用/20

官方提供了点云ros包 astra_visual

运行 astra_visual 包内的 pointCloud_pub.launch,并在 rviz 中添加 pointCloud2 组件订阅主题

1
roslaunch astra_visual pointCloud_pub.launch

即可看到 rviz 中间有一团点云在闪动,查看源码即可看到点云生成过程

/images/2022-11-23-Astra-Pro相机配置及使用/21

可能出现问题

报权限错误,并且出现获取不到设备的警告时,需要检测是否可以识别 video0 设备以及 usb 设备,可以给摄像头读写权限:

1
sudo chmod 777 /dev/bus/usb/002/*

如果出现 process has died 的错误:

/images/2022-11-23-Astra-Pro相机配置及使用/22

请确保当前只有一个使用相机的程序在运行,可以查看后台程序,查找是否之前已经开启过相机程序