繁体   English   中英

使用rgl与无头显示器

[英]Using rgl with headless display

我安装了Xfvb并实例化了一个显示实例:

$ Xvfb :2 -screen 0 1280x960x24 &

然后我从源代码中分别安装了R 3.2.5和rgl 0.95.1441,并在端口2上打开了与DISPLAY的连接。然后我尝试使用一些基本的rgl例程运行测试rgl会话:

$ DISPLAY=:2 /usr/local/bin/R
R version 3.2.5 (2016-04-14) -- "Very, Very Secure Dishes"
...
> library(rgl)
> open3d()
> x <- sort(rnorm(1000))
> y <- rnorm(1000)
> z <- rnorm(1000) + atan2(x,y)
glX
 1
> plot3d(x, y, z, col=rainbow(1000))
> rgl.postscript("foo.pdf", fmt="pdf")
> sessionInfo()

这里的rgl.postscript()命令应该打印出一个PDF文件,其中包含传递给plot3d()的数据点的渲染。 但是,生成的PDF文件为空。

我是如何安装或实例化Xvfb和/或R的配置问题,这会导致显示问题?


以下是典型运行会话的日志:

R version 3.2.5 (2016-04-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Fedora release 14 (Laughlin)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  base

other attached packages:
[1] rgl_0.95.1441  optparse_1.3.2

loaded via a namespace (and not attached):
[1] getopt_1.20.0 methods_3.2.5

5 XSELINUXs still allocated at reset
SCREEN: 0 objects of 136 bytes = 0 total bytes 0 private allocs
DEVICE: 4 objects of 32 bytes = 128 total bytes 0 private allocs
CLIENT: 0 objects of 160 bytes = 0 total bytes 0 private allocs
WINDOW: 0 objects of 48 bytes = 0 total bytes 0 private allocs
PIXMAP: 1 objects of 16 bytes = 16 total bytes 0 private allocs
GC: 0 objects of 56 bytes = 0 total bytes 0 private allocs
CURSOR: 0 objects of 8 bytes = 0 total bytes 0 private allocs
CURSOR_BITS: 0 objects of 8 bytes = 0 total bytes 0 private allocs
DBE_WINDOW: 0 objects of 24 bytes = 0 total bytes 0 private allocs
TOTAL: 5 objects, 144 bytes, 0 allocs
4 DEVICEs still allocated at reset
DEVICE: 4 objects of 32 bytes = 128 total bytes 0 private allocs
CLIENT: 0 objects of 160 bytes = 0 total bytes 0 private allocs
WINDOW: 0 objects of 48 bytes = 0 total bytes 0 private allocs
PIXMAP: 1 objects of 16 bytes = 16 total bytes 0 private allocs
GC: 0 objects of 56 bytes = 0 total bytes 0 private allocs
CURSOR: 0 objects of 8 bytes = 0 total bytes 0 private allocs
CURSOR_BITS: 0 objects of 8 bytes = 0 total bytes 0 private allocs
DBE_WINDOW: 0 objects of 24 bytes = 0 total bytes 0 private allocs
TOTAL: 5 objects, 144 bytes, 0 allocs
1 PIXMAPs still allocated at reset
PIXMAP: 1 objects of 16 bytes = 16 total bytes 0 private allocs
GC: 0 objects of 56 bytes = 0 total bytes 0 private allocs
CURSOR: 0 objects of 8 bytes = 0 total bytes 0 private allocs
CURSOR_BITS: 0 objects of 8 bytes = 0 total bytes 0 private allocs
DBE_WINDOW: 0 objects of 24 bytes = 0 total bytes 0 private allocs
TOTAL: 1 objects, 16 bytes, 0 allocs

除了Fedora 14的,我还测试了相同版本的Rrgl下的CentOS的Linux发行版1511年2月7日。

在Fedora 14盒子上,我正在运行:

xorg-x11-server-Xvfb.x86_64   v1.9.5-2.fc14

在CentOS 7上,我正在运行:

xorg-x11-server-Xvfb.x86_64   v1.17.2-10.el7

在这两种测试服务器,当我运行我的测试R脚本,我从一个白色的空PDF rgl.postscript()和黑色,空PNG rgl.snapshot()连同相同Xvfb日志语句)。

我应该强调,我希望创建一个包含渲染场景的PDF文件,该场景采用基于矢量的格式。 虽然rgl.snapshot()可以帮助解决问题的原因,但该调用返回PNG位图,而不是矢量格式的PDF。 对于我的目的,位图不适用于最终产品。

除了运行传递给它的DISPLAY变量设置R ,我还使用了export

$ DISPLAY=:2 /usr/local/bin/R

要么:

$ export DISPLAY=":2" 
$ /usr/local/bin/R
...

两种方法都会产生相同的结果。

如果其他细节有用,请随时留下具体细节的评论,我会尽我所能跟进。


Fedora 14和CentOS 7盒都不应该有专有的libgl驱动程序。 据我所知,这些是独立的无头服务器。 Fedora 14盒子实际上是一个虚拟机。 如果有具体的确认方式,请告诉我。

我在Fedora 14无头服务器下安装了以下Xdummy软件包:

xorg-x11-drv-dummy.x86_64   v0.3.4-1.fc14

在CentOS 7机器上:

xorg-x11-drv-dummy.x86_64   v0.3.6-21.el7

在CentOS 7服务器上,我运行Xdummy脚本来创建一个显示:10

$ sudo ./Xdummy -debug :10 -depth 16 -geom 1024x768

在另一个shell中,我运行R和测试rgl例程:

$ DISPLAY=":10" /usr/local/bin/R
...
> library(rgl)
> open3d()
> x <- sort(rnorm(1000))
> y <- rnorm(1000)
> z <- rnorm(1000) + atan2(x,y)
> plot3d(x, y, z, col=rainbow(1000))
> rgl.postscript("foo.pdf", fmt="pdf")

Xvfb ,生成的PDF文件是一个空白文档,不包含任何数据点。

这似乎与rgl包紧密交织在一起。 假设我们plot3D Xvfb和朋友支持Cairo并用plot3D代替rgl

library(Cairo)
library(plot3D)
CairoPDF()
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x, y)
scatter3D(x, y, z)
dev.off()

这仍然需要在X11(即xterm)下运行,但是避免调出X11窗口并在Rplots.pdf留下PDF图(你可以控制文件名,当然还有很多其他的图表细节。)

在此输入图像描述

(转换为JPEG以便在此处插入,但它确实是PDF。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM