【问题标题】:How to get ROS GSCam to Work in a Docker Container?如何让 ROS GSCam 在 Docker 容器中工作?
【发布时间】: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


【解决方案1】:

here 给出的答案中,我意识到我的问题源于常见的 ROS GSCam 包(通过 ppa 下载)使用 GStreamer0.10,但是因为我是从它使用的 Docker 映像中的源代码构建包GStreamer1.0。将构建依赖项更改为

<build_depend>libgstreamer0.10-dev</build_depend>
<build_depend>libgstreamer-plugins-base0.10-dev</build_depend>

package.xml 文件中解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多