如何让 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
文件中解决了问题。
我正在尝试使用 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
,这似乎没有意义。我错过了什么?尽管所有元素都成功更改状态,但管道状态更改是否会失败?或者管道是否有其他(可能是隐藏的)元素无法更改状态?
根据给出的答案
<build_depend>libgstreamer0.10-dev</build_depend>
<build_depend>libgstreamer-plugins-base0.10-dev</build_depend>
在 package.xml
文件中解决了问题。