Qualcomm Robotics RB5 平台软件用户指南(9)

150 篇文章 7 订阅
25 篇文章 0 订阅


4.14 更新视频编码参数用例

此用例描述如何更新静态和动态参数。

更新静态参数

  1. qtic2venc执行以下命令,通过插件 设置码率、码率控制和I帧间隔。

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=3840,height=2160,framerate=30/1 ! queue ! qtic2venc target-bitrate=6000000 control-rate=2 ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux.mp4
    
  2. 该qtiqmmfsrc元素从相机捕获 1080p 分辨率流。

  3. 插件qtic2venc对其进行编码,码率为6 Mbps,码率控制设置为恒定,I帧间隔设置为29,即每第30帧为I帧。

  4. h264parse和元素mp4mux处理比特流并准备存储。

  5. 队列元素确保每条路径和轨道彼此独立运行。

  6. 这些filesink元素将缓冲区存储在相应的文件中。

更新动态码率参数

  1. 当管道处于 PLAYING 状态时, 使用 Qualcomm 命令行工具运行用例,gst-pipeline-app通过插件动态设置比特率。qtic2venc

    gst-pipeline-app -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=3840,height=2160,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux.mp4
    
  2. 选择应修改属性的元素。所有可以更新的属性均列出并附有说明。对于上述示例,c2_vencencoder0选择了。

  3. 要选择属性,请键入选项编号和当前值。

4.15 视频合成用例

先决条件:

  1. 确保 Weston 正在运行。

  2. 运行以下命令来创建测试视频。按CTRL + C 停止录制。

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux.mp4
    

4.15.1 画中画:1080p 相机预览和 1080p 录制的 H.264 视频文件播放

下图显示了摄像机的 1080p 实时预览以及右下角 640 × 360 目标窗口中的 1080p 录制视频播放。

  1. 要执行此用例,请运行以下命令。

    • Linux Ubuntu:

      export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 qtiqmmfsrc name=qmmf ! video/x-raw\(memory:GBM\),width=1920,height=1080 ! qtivcomposer name=mix sink_0::position="<0, 0>" sink_0::dimensions="<1920,1080>" sink_1::position="<1280, 720>" sink_1::dimensions="<640, 360>" mix. ! video/x-raw\(memory:GBM\),format=NV12 ! queue ! waylandsink sync=false fullscreen=true filesrc location=/data/output/mux.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix
      
    • 嵌入式Linux:

      export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 qtiqmmfsrc name=qmmf ! video/x-raw\(memory:GBM\),width=1920,height=1080 ! qtivcomposer name=mix sink_0::position="<0, 0>" sink_0::dimensions="<1920,1080>" sink_1::position="<1280, 720>" sink_1::dimensions="<640, 360>" mix. ! video/x-raw\(memory:GBM\),format=NV12 ! queue ! waylandsink sync=false fullscreen=true filesrc location=/data/output/mux.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix
      
  2. 该qtiqmmfsrc元件从相机捕获 1080p 分辨率流并将其传递给该qtivcomposer元件。

  3. 另一个 1080p 流由该filesrc元素从存储的文件中读取并传递给该qtivcomposer元素。

  4. 该qtivcomposer元素将来自相机的流缩小到 640 x 480 并将其合成在从 获得的缓冲区之上filesrc。然后将组合的缓冲区传递给waylandsink.

  5. 该waylandsink元素在显示器上呈现组合缓冲区。

4.15.2 视频平铺:多个视频流平铺在一个输出中

下图说明了由放置在 2 × 2 网格中的四个输入构成的输出的用例,其中一个输入流是摄像机的 1080p 实时预览,其余三个流是 1080p 录像机视频。
在这里插入图片描述

  1. 运行以下命令。

    • Linux Ubuntu:

      export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 qtiqmmfsrc name=qmmf ! video/x-raw\(memory:GBM\),width=1920,height=1080 ! qtivcomposer name=mix sink_0::position="<0, 0>" sink_0::dimensions="<960,540>" sink_1::position="<960, 0>" sink_1::dimensions="<960, 540>" sink_2::position="<0, 540>" sink_2::dimensions="<960, 540>" sink_3::position="<960, 540>" sink_3::dimensions="<960, 540>" mix. ! video/x-raw\(memory:GBM\),format=NV12 ! queue ! waylandsink sync=false fullscreen=true filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix. filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix. filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix.
      
    • 嵌入式Linux:

      export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 qtiqmmfsrc name=qmmf ! video/x-raw\(memory:GBM\),width=1920,height=1080 ! qtivcomposer name=mix sink_0::position="<0, 0>" sink_0::dimensions="<960,540>" sink_1::position="<960, 0>" sink_1::dimensions="<960, 540>" sink_2::position="<0, 540>" sink_2::dimensions="<960, 540>" sink_3::position="<960, 540>" sink_3::dimensions="<960, 540>" mix. ! video/x-raw\(memory:GBM\),format=NV12 ! queue ! waylandsink sync=false fullscreen=true filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix. filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix. filesrc location=/data/output/mux_1080p_avc.mp4 ! qtdemux ! h264parse ! qtic2vdec ! mix.
      
  2. 该qtiqmmfsrc元件从相机捕获 1080p 分辨率流并将其传递给该qtivcomposer元件。

  3. 其他三个 1080p 流按元素从存储的文件中读取filesrc并传递给qtivcomposer元素。

  4. 该qtivcomposer元素将流缓冲区缩小到 960 × 540 并将它们组成 2 × 2 网格。然后将组合的缓冲区传递给waylandsink.

  5. 该waylandsink元素在显示器上呈现组合缓冲区。

4.16 UBWC 控制用例

示例用例使您能够控制每个视频流的 UBWC。 UBWC 有助于降低用例的内存带宽和功耗要求。该平台的所有主要模块(例如摄像头、视频、显示)都支持 UBWC,并实现高效的端到端用例。

4.16.1 使用内存压缩和视频录制进行实时预览

  1. 运行以下命令来执行用例。

    • Linux Ubuntu:

      export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e qtiqmmfsrc name=qmmf ! "video/x-raw(memory:GBM),format=NV12,compression=ubwc,width=1920,height=1080,framerate=30/1" ! waylandsink sync=false fullscreen=true enable-last-sample=false qmmf. ! "video/x-raw(memory:GBM),format=NV12,width=1920,height=1080,framerate=30/1,camera=0"! qtic2venc ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux.mp4
      
    • 嵌入式Linux:

      export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e qtiqmmfsrc name=qmmf ! "video/x-raw(memory:GBM),format=NV12,compression=ubwc,width=1920,height=1080,framerate=30/1" ! waylandsink sync=false fullscreen=true enable-last-sample=false qmmf. ! "video/x-raw(memory:GBM),format=NV12,width=1920,height=1080,framerate=30/1,camera=0"! qtic2venc ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux.mp4
      
  2. GStreamerqtiqmmfsrc插件生成 1 个内存压缩 YUV 流 (UBWC) 和 1 个无内存压缩 YUV 流(非 UBWC)。

  3. 流参数(例如宽度、高度、帧速率和格式)指定为capsfilter.

  4. 中的压缩参数capsfilter用于控制UBWC,当设置为compression=UBWC时,将为该特定流启用UBWC。然后,两个连接插件使用 UBWC 缓冲区。

  5. GStreamerwaylandsink插件处理压缩流并将其渲染到 HDMI 显示器上。

  6. 插件qtic2venc编码、h264parse处理, mp4mux插件包装 MP4 容器,filesink 插件转储未压缩的流。

在这里插入图片描述

4.16.2 1080p 视频缩小至 720p

在此用例中,1080p AVC 视频流被解码为 YUV,缩小为 720p,然后在 AVC 编码后转储到文件。

  1. 运行以下命令来执行用例。

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! qtic2vdec ! video/x-raw\(memory:GBM\),format=NV12, compression=ubwc ! queue ! qtivtransform ! video/x-raw\(memory:GBM\),format=NV12,compression=ubwc,width=1280,height=720 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux2.mp4
    
  2. h264parse解析缓冲区并将qtic2vdec缓冲区解码为 YUV。

  3. qtic2vdec将压缩的 (UBWC) YUV 缓冲区共享到qtivtransform.

  4. qtivtransform使用硬件加速将缓冲区缩小到 720p 并将其传递给qtic2venc.

  5. qtic2venc使用硬件加速将缓冲区编码为 H264 并将其传递给filesink.

  6. filesink然后将编码流存储到文件中。

  7. 要停止用例,请按CTRL + C,使用以下命令从设备中拉出录制的内容adb pull,然后在主机 PC 上播放该内容。

    adb pull /data/video.h264
    

4.17 通过 RTSP 进行直播,具有两个 H.264 流

本主题描述了两个 H264 流的用例,其中一个流被存储,另一个流通过 RTSP 进行实时流传输。

要执行用例,请执行以下操作:

  1. 在目标上运行 RTSP 服务器udpsrc。

    gst-rtsp-server -p 8900 -m /live "( udpsrc name=pay0 port=8554 caps=\"application/x-rtp,media=video,clockrate=90000,encodingname=H264,payload=96\" )" & gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=3840,height=2160,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux1.mp4 qmmf. ! video/x-raw\(memory:GBM\),format=NV12,width=640,height=480,framerate=30/1 ! queue ! qtic2venc ! h264parse config-interval=-1 ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=8554
    

RTSP 服务器在端口号 8900 上启动。该服务器使用 接收视频流udpsrc,处理 RTP 负载,然后通过端口号 8900 通过网络进行流式传输。

  1. 执行以下命令,为RTSP服务器创建视频流。

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf ! video/x-h264,format=NV12,width=1920,height=1080,framerate=30/1 ! h264parse ! mp4mux ! queue ! filesink location="/data/mux.mp4" qmmf. ! video/x-h264,format=NV12,width=1920,height=1080,framerate=30/1 ! h264parse config-interval=1 ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=8554
    
    • GStreamerqtiqmmfsrc插件可创建 1080p AVC 编码的视频流。
    • 第一个流由 处理h264parse,由插件打包到 MP4 容器中,并由插件mp4mux转储到文件。filesink
    • 第二个流由 处理h264parse。rtph264vpay 将缓冲区打包成 RTP 有效负载以进行流式传输,并且该udpsink元素将此数据发送到gst-rtsp-server.

4.18 并行 4K 编码和 1080p 解码

本节介绍在 HDMI 显示器上解码和播放 1080p H.264 编码视频,同时捕获 4K H.264 编码视频并将其存储在文件中的用例。

视频硬件并行执行编码和解码。

先决条件:

  1. 确保 Weston 正在运行。

  2. 录制 1080p 测试视频进行播放或推送预先录制的视频。

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux1.mp4
    

要执行用例,请执行以下操作:

  1. 要开始 4K H.264 录制,请在一个终端中运行以下命令:

    gst-launch-1.0 -e qtiqmmfsrc name=qmmf camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=3840,height=2160,framerate=30/1 ! queue ! qtic2venc ! queue ! h264parse ! mp4mux ! queue ! filesink location=/data/output/mux2.mp4
    
    • 该qtiqmmfsrc元素用于捕获和编码视频流。
    • 和h264parse元素mp4mux处理缓冲区并准备存储
    • 该filesink元素将缓冲区存储在文件中。
  2. 要在 HDMI 上播放录制的 1080p 视频,请在另一个终端中运行以下命令。

    • Linux Ubuntu:
      export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 filesrc location=/data/output/mux1.mp4 ! qtdemux name=demux demux. ! queue ! h264parse ! qtic2vdec ! video/x-raw\(memory:GBM\),compression=ubwc ! waylandsink fullscreen=true
      
    • 嵌入式Linux:
      export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 filesrc location=/data/output/mux1.mp4 ! qtdemux name=demux demux. ! queue ! h264parse ! qtic2vdec ! video/x-raw\(memory:GBM\),compression=ubwc ! waylandsink fullscreen=true
      
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Robotics Toolbox创建ur5机械臂模型,您需要遵循以下步骤: 1. 安装MATLAB Robotics Toolbox。 2. 下载Universal Robots URDF文件。 3. 将URDF文件导入MATLAB中并使用robotics.URDF类读取。 4. 使用robotics.RigidBodyTree类创建机器人模型。 5. 添加所有关节和链接。 6. 定义机器人末端执行器(End Effector)。 7. 设置机器人的关节角度和末端执行器位置。 这里是一个示例代码,可以帮助您进一步了解如何使用Robotics Toolbox创建ur5机械臂模型: ``` % 安装Robotics Toolbox % 下载URDF文件 urdf = 'ur5.urdf'; ur5 = robotics.URDF(urdf); % 创建RigidBodyTree对象 robot = robotics.RigidBodyTree; % 添加链接 link1 = robotics.RigidBody('link1'); joint1 = robotics.Joint('joint1', 'revolute'); setFixedTransform(joint1, trvec2tform([0 0 0])); joint1.JointAxis = [0 0 1]; link1.Joint = joint1; addBody(robot, link1, 'base'); link2 = robotics.RigidBody('link2'); joint2 = robotics.Joint('joint2', 'revolute'); setFixedTransform(joint2, trvec2tform([0 0 0.163])); joint2.JointAxis = [1 0 0]; link2.Joint = joint2; addBody(robot, link2, 'link1'); % ... 添加更多链接和关节 % 添加末端执行器 eeBody = robotics.RigidBody('EndEffector'); setFixedTransform(eeBody.Joint, trvec2tform([0 0 0.09])); addBody(robot, eeBody, 'tool0'); % 设置关节角度和末端执行器位置 q = zeros(1,6); eePos = [0.4 0.1 0.3]; eeOri = [pi/2 0 pi/2]; tform = eul2tform(eeOri); tform(1:3, 4) = eePos; q = ik(eeBody, tform, [1 1 1 0 0 0]); show(robot, q); ``` 这个示例代码将创建一个ur5机械臂模型,并设置关节角度和末端执行器位置。您可以通过修改关节角度和末端执行器位置来控制机器人的运动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值