[Question] About the usage of shared memory in docker
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 25/100
- Issue 类型
- 文档
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- docker, python
调研方向
先查看链接的 CycloneDDS 共享内存限制页面、CYCLONEDDS_URI XML 配置,以及 inline publisher 和 subscriber 入口点。使用所示的 network、IPC 和 volume 选项运行容器,然后检查文档中记录的诊断信息和共享内存状态;当文档说明如何验证传输,以及进程是否应出现在 ipcs -m 中时,文档工作即告完成。
由索引模型根据 Issue 内容生成。
描述
Hi,
I'm trying to setup environment and other thins to be able to transfer messages using shared memory. First of all, here is my Image class:
Image class
@dataclass
class MainCameraImage(IdlStruct):
img: array[uint8, 4147200]
shape: array[uint64, 3]
@classmethod
def from_numpy(cls, img):
assert len(img.shape) == 3
seq_img = img.tobytes()
return MainCameraImage(seq_img, tuple(img.shape))
def to_numpy(self):
shape = self.shape
return np.frombuffer(self.img, dtype=np.uint8).reshape(shape)
Note that image array has a fixed size. Then I implement publisher and subscriber:
Publisher
import cv2
import time
import numpy as np
import fire
from cyclonedds.core import Listener, Qos, Policy
from cyclonedds.util import duration
from cyclonedds.internal import dds_infinity
from cyclonedds.domain import DomainParticipant
from cyclonedds.topic import Topic
from cyclonedds.pub import DataWriter
from dds_data_structures import MainCameraImage, Image, CameraState,DeviceState
def stream(dev=0, resize_to=None, output_topic_names=['camera_images', 'camera_images_vis', 'camera_images_clr'],
data_type='MainCameraImage', cap_gstreamer=True):
data_type = MainCameraImage
participant = DomainParticipant(0)
writers = []
# unknown, disabled, enabled, error
qos = Qos(
# livelines: automatic
# deadline: dds_infinity
# reliability: reliable
# durability: volatile
# history: keep last
Policy.Liveliness.Automatic(lease_duration=duration(seconds=10)),
Policy.Deadline(deadline=dds_infinity),
Policy.Reliability.Reliable(max_blocking_time=duration(seconds=1)),
Policy.Durability.Volatile,
Policy.History.KeepLast(1)
)
for topic_name in output_topic_names:
topic_out = Topic(participant, topic_name, data_type)
writers.append(DataWriter(participant, topic_out, qos))
frame = np.random.randint(0, 256, (1280, 1080, 3), dtype=np.uint8)
print(frame.shape, frame.dtype)
while True:
time_start = time.time()
ret, frame = 1, frame
if not ret:
print('Error: Unable to read frame')
break
if resize_to is not None:
frame = cv2.resize(frame, resize_to[::-1])
for writer in writers:
writer.write(data_type.from_numpy(frame))
loop_time = time.time() - time_start
print(f'Streaming Camera with topic {output_topic_names[0]}, {loop_time=}', end='\r')
if __name__ == '__main__':
fire.Fire(stream)
Subscriber
import cv2
import time
import numpy as np
import fire
from cyclonedds.core import Listener, Qos, Policy
from cyclonedds.util import duration
from cyclonedds.internal import dds_infinity
from cyclonedds.domain import DomainParticipant
from cyclonedds.topic import Topic
from cyclonedds.sub import DataReader
from dds_data_structures import MainCameraImage
def receive(topic_name='camera_images'):
data_type = MainCameraImage
participant = DomainParticipant(0)
qos = Qos(
# livelines: automatic
# deadline: dds_infinity
# reliability: reliable
# durability: volatile
# history: keep last
Policy.Liveliness.Automatic(lease_duration=duration(seconds=10)),
Policy.Deadline(deadline=dds_infinity),
Policy.Reliability.Reliable(max_blocking_time=duration(seconds=1)),
Policy.Durability.Volatile,
Policy.History.KeepLast(1)
)
topic_in = Topic(participant, topic_name, data_type)
reader = DataReader(participant, topic_in, qos)
while True:
time_start = time.time()
img = reader.read()
if len(img) == 0:
continue
img = img[0].to_numpy()
loop_time = time.time() - time_start
print(f'Received img {img.shape=}, {loop_time=}', end='\r')
if __name__ == '__main__':
fire.Fire(receive)
I've checked the requirements to the QoS for both publisher and subscriber here (as far as I can see they should be identical).
Next step I'm running iceoryx roudi in one docker container with --net=host --ipc=host -v /dev:/dev -v /tmp:/tmp. I also set the environment variable CYCLONEDDS_URI to the config file. I'm using default config file:
CYclonedds uri config
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain Id="any">
<General>
<Interfaces>
<NetworkInterface autodetermine="true" priority="default" multicast="default" />
</Interfaces>
<AllowMulticast>default</AllowMulticast>
</General>
<SharedMemory>
<Enable>true</Enable>
<LogLevel>info</LogLevel>
</SharedMemory>
</Domain>
</CycloneDDS>
Finally I run above scripts in the docker containers with the same net and ipc options. They work fine and subscriber receives messages from publisher. What I'm trying to understand:
- How to make sure that messages are being sent via shared memory?
ipcs -mshows only firefox and vs code processes (I've checked pids via `ps -p ). Should my subscriber and publisher be there if everything works as expected?
- 主要语言
- Python
- 星标
- 110
- 派生
- 68
- 平均合并
- 3 天 5 小时
- 30 天内合并 PR
- 1
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
eclipse-cyclonedds/cyclonedds-python 的其他 Issue
-
难度 4/5 3-5 天 新手友好度 52/100
-
Generated Python code is not interoperable when a union contains a member called "value"可能重新可做 关联的 PR 已关闭且未合并。 未关闭
难度 3/5 1-2 天 新手友好度 58/100
-
难度 4/5 3-5 天 新手友好度 48/100
-
难度 4/5 3-5 天 新手友好度 45/100
-
难度 4/5 3-5 天 新手友好度 48/100
eclipse-cyclonedds/cyclonedds-python#333 · 1 条评论 ·
查看 eclipse-cyclonedds/cyclonedds-python 的全部 Issue
相似的 Issue
-
enhancement
难度 2/5 1-3 小时 新手友好度 72/100
fossasia/visdom-dev#77 ·
维护者通常 4 天内回复
-
难度 2/5 1-3 小时 新手友好度 82/100
aws-cloudformation/cfn-lint#4890 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 82/100
volcengine/OpenViking#6521 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 84/100
-
bug
难度 2/5 1-3 小时 新手友好度 77/100
AstrBotDevs/AstrBot#10720 ·
维护者通常 1 天内回复