【发布时间】:2021-07-03 23:04:43
【问题描述】:
我正在尝试使用 Docker 容器中的 ROS GSCam 包从摄像头流中读取并发布到 ROS 主题。通过gst-launch 使用 GStreamer 在容器中可以正常工作。例如,运行
gst-launch-1.0 -v tcpclientsrc host=10.0.0.20 port=7001 ! decodebin ! filesink location= xyz.flv
在容器中成功将摄像头流保存到xyz.flv文件中。当我尝试使用以下命令使用 GSCam 时
roscd gscam
mkdir bin
cd bin
export GSCAM_CONFIG="tcpclientsrc host=10.0.0.20 port=7001 ! decodebin ! ffmpegcolorspace"
rosrun gscam gscam
如果这些命令在容器外运行,相机流将发布到 ROS 主题,但在容器内运行时,它们会产生以下输出:
[ INFO] [1625351876.482947987]: Using GStreamer config from env: "tcpclientsrc host=10.0.0.20 port=7001 ! decodebin ! ffmpegcolorspace"
[ INFO] [1625351876.486672898]: using default calibration URL
[ INFO] [1625351876.486702714]: camera calibration URL: file:///root/.ros/camera_info/camera.yaml
[ INFO] [1625351876.486735225]: Unable to open camera calibration file [/root/.ros/camera_info/camera.yaml]
[ WARN] [1625351876.486750795]: Camera calibration file /root/.ros/camera_info/camera.yaml not found.
[ INFO] [1625351876.486759250]: Loaded camera calibration from
[ INFO] [1625351876.502708790]: Time offset: 1625351189.738
[FATAL] [1625351876.519311654]: Failed to PAUSE stream, check your GStreamer configuration.
[FATAL] [1625351876.519330710]: Failed to initialize GSCam stream!
我能做些什么来解决这个问题?
编辑。问题似乎来自这段代码:
gst_element_set_state(pipeline_, GST_STATE_PAUSED);
if (gst_element_get_state(pipeline_, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) {
ROS_FATAL("Failed to PAUSE stream, check your gstreamer configuration.");
return false;
}
使用来自here 的代码,我可以看到gst_element_set_state() 的返回值为SUCCESS,对于管道的每个元素(tcpclientsrc0、decodebin0 和appsink0),gst_element_get_state() 的返回值也是如此。然而奇怪的是,gst_element_get_state(pipeline_, NULL, NULL, -1) 的输出是FAILURE,这似乎没有意义。我错过了什么?尽管所有元素都成功更改了状态,但管道状态更改是否会失败?还是管道是否有其他(可能是隐藏的)元素无法更改状态?
【问题讨论】:
-
你试过在没有
ffmpegcolorspace的情况下运行它吗?这似乎是与您的第一个示例的唯一区别。 -
是的,它给出了同样的错误。由于在
GSCAM_CONFIG中包含ffmpegcolorspace在容器外工作,我怀疑它是罪魁祸首。 -
对不起,我帮不上忙。您很可能会得到更好的支持,直接在ROS Discourse 上提出这个问题
-
您应该尝试在ROS answers 上提出您的问题,这与 StackOverflow 相同,但专门针对 ROS。
标签: c++ docker containers gstreamer ros