Astra相机(售价150)是由乐视与奥比中光合作生产的一款体感相机,其对标微软Kinect相机(售价800+),可用于机器视觉、3D点云、opencv、SLAM学习,支持ROS框架能够在ubuntu、windows、Android等系统下进行开发。其官方(https://orbbec3d.com/develop/)提供了相应的SDK供开发者使用。
相机的具体参数如下所示,本文主要讲解如何在Ubuntu端搭建基于ROS的开发环境。
Astra相机官方提供了ROS驱动进行开发,该驱动目前仅支持ROS Kinetic 和 Melodic版本。
该项目的官方地址为https://github.com/orbbec/ros_astra_camera,由于处于外网原因,建议将其搬运至国内码云后进行下载,此处提供我搬运的码云地址:https://gitee.com/jasonli0012/ros_astra_camera
下载完项目源码后,需要先进行安装依赖文件。此处安装命令中的**$ROS_DISTRO**将根据你的ROS版本不同而不同,此处我选择Melodic版本进行开发,Astra相机同样支持ROS Kinetic版本的开发。
sudo apt install ros-$ROS_DISTRO-rgbd-launch ros-$ROS_DISTRO-libuvc ros-$ROS_DISTRO-libuvc-camera ros-$ROS_DISTRO-libuvc-ros
完成安装依赖文件后,需要新建一个工作空间用于对Astra相机的ROS开发。
# 新建工作空间
mkdir -p astra/src
cd astra
catkin_make
source devel/setup.bash
# 将下载的源码移动至src目录下
cd src
mv ~/ros_astra_camera ~/ws/astra/src/
# 编译
cd ..
catkin_make
编译成功后如图所示:
此处建议大家将source devel/setup.bash
写入 .bashrc文件中,以防止之后重复操作。此处我用的命令行为zsh所以修改的文件为 .zshrc,加载的文件为 setup.zsh。
# bash
sudo vi ~/.bashrc
# 填写你自己的工作空间目录
source ~/ws/astra/devel/setup.bash
# zsh
sudo vi ~/.zshrc
# 填写你自己的工作空间目录
source ~/ws/astra/devel/setup.zsh
为了方便之后进行开发,需要将Astra相机的串口号固定表示。其官方功能包中就自带脚本,只需要直接运行即可。
roscd astra_camera
# 运行脚本
./scripts/create_udev_rules
# 到达工作空间下
roscd astra_camera
cd ../..
# 编译
catkin_make -j7
上述命令中编译命令catkin_make后带的参数表示使用几核(CPU核心)进行编译,此处表明使用7核心进行编译以达到快速编译。
由于官方提供的launch文件是通过设备的 vendor (设备贴牌)和 product (设备ID)进行启动节点的,所以首先我们需要确定设备的贴牌和ID 。
在命令行输入命令lsusb
分别查看Astra相机插拔前后的设备信息,可以发现设备信息。
通过对比,排除多出的USB驱动外,剩余的两项即为设备信息
Bus 001 Device 019: ID 2bc5:0502
Bus 001 Device 018: ID 2bc5:0403
其中设备的贴牌为 2bc5 ,而0502 代表彩色摄像头,0403代表深度摄像头。
在获取设备信息后,我们需要修改官方提供的launch文件。
# 找到launch文件所在目录
roscd astra_camera/launch
# 编辑launch文件
sudo gedit astra_pro。launch
打开launch文件后,找到第71行,将设备的属性修改为彩色相机的设备ID。
启动launch文件,运行节点。出现如下图所示内容即表示运行成功。此处黄色报警内容可暂时忽略。
roslaunch astra_carma astrapro.launch
rosrun rqt_image_view rqt_image_view
在rqt工具上方选择所需订阅的话题即可调出不同的图片,此处展示为彩色图片(rgb)中的原图(image_raw),此外也可以选择深度、红外等所需图像。
由于相机本身存在畸变,所以需要使用一些配置文件来完成去畸变工作。此处给出Astra相机中彩色相机和深度相机的内参配置文件。
camera.yaml文件
image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
rows: 3
cols: 3
data: [577.54679, 0. , 310.24326,
0. , 578.63325, 253.65539,
0. , 0. , 1. ]
camera_model: plumb_bob
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [0.125197, -0.196591, 0.006816, -0.006225, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [590.55457, 0. , 306.57339, 0. ,
0. , 592.83978, 256.43008, 0. ,
0. , 0. , 1. , 0. ]
depth.yaml 文件
image_width: 640
image_height: 480
camera_name: depth_Astra_Orbbec
camera_matrix:
rows: 3
cols: 3
data: [582.795354, 0.000000, 326.415982, 0.000000, 584.395006, 249.989410, 0.000000, 0.000000, 1.000000]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.068613, 0.174404, 0.001015, 0.006240, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000]
projection_matrix:
rows: 3
cols: 4
data: [586.186035, 0.000000, 329.702427, 0.000000, 0.000000, 590.631409, 250.167765, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
复制上述文件并放置到cfg文件夹中即可。
#路径
roscd astra_camera/cfg
为了在启动launch文件时调用内参文件,需要对其进行修改。
roscd astra_camera/launch
sudo gedit astrapro.launch
此处使用gedit编辑器打开launch文件并修改其25、26行内容,将内参文件的地址填写入内。
# 原内容:
<arg name="rgb_camera_info_url" default="" />
<arg name="depth_camera_info_url" default="" />
# 替换为:
<arg name="rgb_camera_info_url" default="file://$(find astra_camera)/cfg/camera.yaml" />
<arg name="depth_camera_info_url" default="file://$(find astra_camera)/cfg/depth.yaml" />
随后向下,找到第84行修改为如下内容:
# 原内容:
<param name="camera_info_url" value="" />
# 替换为:
<param name="camera_info_url" type="string" value="$(arg rgb_camera_info_url)" />
配置完成后可以再次启动节点,查看校准后的图像内容。
除了使用rqt工具进行查看图像外,还可以使用rviz工具进行查看图像。命令行中直接启动rviz工具。
rviz
此时的rviz内尚未订阅任何节点,此时可以订阅查看图像信息。点击左下方Add按钮选择image类型,添加图像节点。
随后在左侧打开选项卡image,在image Topic中选择自己订阅的节点即可。
上述步骤可重复进行,从而达到订阅多个摄像头节点。如下图即为同时打开三个摄像头。
同样再次点击左下方Add按钮,选择PointCloud2类型新建内容。
随后,在左侧PointCloud2选项下订阅 /camera/depth_registered/points话题,并将Global Options下Fixed Frame选为camera_depth_optical_frame。完成上述操作后,即可在中央查看到点云选项。
为了方便之后减少重复打开rviz添加上述内容的工作,此处提供了rviz的参数文件以方便再次打开。
Panels:
- Class: rviz/Displays
Help Height: 0
Name: Displays
Property Tree Widget:
Expanded:
- /Global Options1
- /Status1
- /PointCloud21
- /Depth1
- /ir1
- /RGB1
Splitter Ratio: 0.5
Tree Height: 361
- Class: rviz/Selection
Name: Selection
- Class: rviz/Tool Properties
Expanded:
- /2D Pose Estimate1
- /2D Nav Goal1
- /Publish Point1
Name: Tool Properties
Splitter Ratio: 0.5886790156364441
- Class: rviz/Views
Expanded:
- /Current View1
Name: Views
Splitter Ratio: 0.5
- Class: rviz/Time
Experimental: false
Name: Time
SyncMode: 0
SyncSource: PointCloud2
Preferences:
PromptSaveOnExit: true
Toolbars:
toolButtonStyle: 2
Visualization Manager:
Class: ""
Displays:
- Alpha: 0.5
Cell Size: 1
Class: rviz/Grid
Color: 159; 147; 147
Enabled: true
Line Style:
Line Width: 0.029999999329447746
Value: Lines
Name: Grid
Normal Cell Count: 0
Offset:
X: 0
Y: 0
Z: 0
Plane: XZ
Plane Cell Count: 10
Reference Frame: camera_depth_optical_frame
Value: true
- Alpha: 1
Autocompute Intensity Bounds: true
Autocompute Value Bounds:
Max Value: 9.859000205993652
Min Value: 0.5799999833106995
Value: true
Axis: X
Channel Name: intensity
Class: rviz/PointCloud2
Color: 255; 255; 255
Color Transformer: RGB8
Decay Time: 0
Enabled: true
Invert Rainbow: false
Max Color: 255; 255; 255
Max Intensity: 4096
Min Color: 0; 0; 0
Min Intensity: 0
Name: PointCloud2
Position Transformer: XYZ
Queue Size: 10
Selectable: true
Size (Pixels): 3
Size (m): 0.009999999776482582
Style: Squares
Topic: /camera/depth_registered/points
Unreliable: false
Use Fixed Frame: true
Use rainbow: true
Value: true
- Class: rviz/Image
Enabled: true
Image Topic: /camera/depth/image_rect
Max Value: 1
Median window: 5
Min Value: 0
Name: Depth
Normalize Range: true
Queue Size: 2
Transport Hint: raw
Unreliable: false
Value: true
- Class: rviz/Image
Enabled: true
Image Topic: /camera/ir/image
Max Value: 1
Median window: 5
Min Value: 0
Name: ir
Normalize Range: true
Queue Size: 2
Transport Hint: raw
Unreliable: false
Value: true
- Class: rviz/Image
Enabled: true
Image Topic: /camera/rgb/image_raw
Max Value: 1
Median window: 5
Min Value: 0
Name: RGB
Normalize Range: true
Queue Size: 2
Transport Hint: raw
Unreliable: false
Value: true
Enabled: true
Global Options:
Background Color: 48; 48; 48
Default Light: true
Fixed Frame: camera_depth_frame
Frame Rate: 30
Name: root
Tools:
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/MoveCamera
- Class: rviz/Select
- Class: rviz/FocusCamera
- Class: rviz/Measure
- Class: rviz/SetInitialPose
Theta std deviation: 0.2617993950843811
Topic: /initialpose
X std deviation: 0.5
Y std deviation: 0.5
- Class: rviz/SetGoal
Topic: /move_base_simple/goal
- Class: rviz/PublishPoint
Single click: true
Topic: /clicked_point
Value: true
Views:
Current:
Class: rviz/Orbit
Distance: 3.863161325454712
Enable Stereo Rendering:
Stereo Eye Separation: 0.05999999865889549
Stereo Focal Distance: 1
Swap Stereo Eyes: false
Value: false
Focal Point:
X: 2.0370023250579834
Y: -1.0987344980239868
Z: -0.031386714428663254
Focal Shape Fixed Size: true
Focal Shape Size: 0.05000000074505806
Invert Z Axis: false
Name: Current View
Near Clip Distance: 0.009999999776482582
Pitch: 0.004796733148396015
Target Frame: <Fixed Frame>
Value: Orbit (rviz)
Yaw: 2.4886555671691895
Saved: ~
Window Geometry:
Depth:
collapsed: false
Displays:
collapsed: false
Height: 961
Hide Left Dock: false
Hide Right Dock: false
QMainWindow State: 000000ff00000000fd0000000400000000000001fa00000323fc020000000afb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f0070006500720074006900650073020000019b000001b500000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000001a6000000c900fffffffb0000000a0044006500700074006801000001e9000000ae0000001600fffffffb00000006005200470042010000029d000000c30000001600fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000019200000323fc0200000005fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d00000211000000a400fffffffb000000040069007201000002540000010c0000001600fffffffb0000000a0049006d00610067006501000002fb000000c00000000000000000fb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d0065010000000000000780000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000003e80000032300000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
RGB:
collapsed: false
Selection:
collapsed: false
Time:
collapsed: false
Tool Properties:
collapsed: false
Views:
collapsed: false
Width: 1920
X: 0
Y: 27
ir:
collapsed: false
新建文件astra_camera.rviz并将上述文件保存其内,最后将文件反正如下目录即可。
# 打开功能包根目录
roscd astra_camera
# 新建文件夹
mkdir rviz
cd rviz
# 复制上述文件至astra_camera.rviz
sudo vi astra_camera.rviz
roscd astra_camera/
rviz -d rviz/astra_camera.rviz
如果需要实时保存当前点云信息,可以直接运行如下节点。该节点将把当前点云信息保存至当前目录下。
rosrun pcl_ros pointcloud_to_pcd input:=/camera/depth_registered/points
保存点云信息时,要注意及时停止(Ctrl+C)否则会生产大量的pcd文件。
查看pcd文件需要使用特定工具,此处介绍工具pcl_viewer
# 安装
sudo apt-get install pcl-tools
查看文件的方式如下,其中xxxx替换为所需查看的文件名。
pcl_viewer xxxx.pcd