如何让 ROS GSCam 在 Docker 容器中工作?

How to get ROS GSCam to Work in a Docker Container?

我正在尝试使用 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() 的 return 值是 SUCCESS,return 的值也是 gst_element_get_state() 对于管道的每个元素(tcpclientsrc0、decodebin0 和 appsink0)。然而奇怪的是,gst_element_get_state(pipeline_, NULL, NULL, -1) 的输出是FAILURE,这似乎没有意义。我错过了什么?尽管所有元素都成功更改状态,但管道状态更改是否会失败?或者管道是否有其他(可能是隐藏的)元素无法更改状态?

根据给出的答案,我意识到我的问题源于以下事实:通用 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 文件中解决了问题。