无法从 Docker 容器内访问以太网摄像头
操作系统:Ubuntu 22.04.4 LTSPylon:pylon_7.5.0.15658-deb0_amd64 摄像头连接到以太网接口 enp0s31f6,该接口位于静态 ip 192.168.2.10/255.255.255.0 上。摄像头位于静态 ip 192....
操作系统:Ubuntu 22.04.4 LTS
塔:pylon_7.5.0.15658-deb0_amd64
摄像机连接到以太网接口, enp0s31f6
该接口使用静态 IP 192.168.2.10/255.255.255.0
。摄像机使用静态 IP 192.168.2.11/255.255.255.0
.
我构建了 pylon-ros-camera ,它成功检测到了相机
但是,即使我成功地在 Docker 容器内构建了相同的包,它也无法检测到摄像头。
我尝试过
-
为了让容器能够看到主机上的接口,我以网络方式运行容器
docker run --network=host -d myimage ...
。现在,如果我ifconfig
在容器内运行,它会显示与主机上相同的接口。请参见ifconfig
主机和容器内的输出。但是,它仍然无法检测到摄像头。 -
我以扩展权限运行了容器
docker run --network=host --privileged -v /dev:/dev -d ...
。但是,它仍然无法检测到相机。
可能存在什么问题?
主机上的 IFCONFIG
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:cff:fe29:3048 prefixlen 64 scopeid 0x20<link>
ether 02:42:0c:29:30:48 txqueuelen 0 (Ethernet)
RX packets 602988 bytes 31801390 (31.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 701650 bytes 5591761213 (5.5 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::ada5:60b0:e461:3007 prefixlen 64 scopeid 0x20<link>
ether 9c:6b:00:07:61:79 txqueuelen 1000 (Ethernet)
RX packets 10880082 bytes 16425539680 (16.4 GB)
RX errors 9 dropped 0 overruns 0 frame 9
TX packets 54503 bytes 3794035 (3.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 memory 0x72500000-72520000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 240419 bytes 70007245 (70.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 240419 bytes 70007245 (70.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.19 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::40ef:b0b9:5215:18e7 prefixlen 64 scopeid 0x20<link>
ether f0:b6:1e:a2:b6:92 txqueuelen 1000 (Ethernet)
RX packets 6337099 bytes 8614290755 (8.6 GB)
RX errors 0 dropped 6672 overruns 0 frame 0
TX packets 1492973 bytes 542835548 (542.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
容器内的 IFCONFIG
root@docker-desktop:/home/basler_ws# ifconfig
br-aa73862743b3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.20.0.1 netmask 255.255.0.0 broadcast 172.20.255.255
inet6 fe80::42:18ff:fe68:6f5e prefixlen 64 scopeid 0x20<link>
ether 02:42:18:68:6f:5e txqueuelen 0 (Ethernet)
RX packets 12 bytes 699 (699.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17 bytes 12202 (12.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-fb4a1a6ffdce: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::42:12ff:feaf:abcc prefixlen 64 scopeid 0x20<link>
ether 02:42:12:af:ab:cc txqueuelen 0 (Ethernet)
RX packets 26 bytes 4052 (4.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 13912 (13.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:be:4c:46:18 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.65.9 netmask 255.255.255.0 broadcast 192.168.65.255
inet6 fe80::5054:ff:fe12:3456 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 19853 bytes 2562859 (2.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18195 bytes 7005442 (7.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 140 bytes 18520 (18.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 140 bytes 18520 (18.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
services1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.65.6 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::3c19:b1ff:fe38:ffcb prefixlen 64 scopeid 0x20<link>
ether 3e:19:b1:38:ff:cb txqueuelen 0 (Ethernet)
RX packets 46 bytes 3709 (3.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 83 bytes 15611 (15.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth150498a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::30b3:9eff:fe24:7a7a prefixlen 64 scopeid 0x20<link>
ether 32:b3:9e:24:7a:7a txqueuelen 0 (Ethernet)
RX packets 26 bytes 4416 (4.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 109 bytes 19474 (19.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
下载声明: 本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!
-
我正在制作一款多人游戏,到目前为止,我已经制作了一个可以移动的玩家、一个平台和多人连接的框架。我确保在制作过程中测试主机和客户端的连接情况
我正在制作一款多人游戏,到目前为止,我制作了一个可以移动的玩家、一个平台和多人连接框架。在构建项目时,我确保测试主机和客户端的连接,一旦我为每个玩家提供了一个跟随他们并可以旋转的摄像头,客户端就会突然不再加入游戏。单击主机按钮会将您放入游戏中并按预期工作,但之后作为客户端加入不会将您生成在平台上。我也没有收到任何错误。以下是可能导致问题的脚本:首先:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.Netcode; using Unity.Netcode.Transports.UTP; [System.Serializable] public struct PlayerNetworkState : INetworkSerializable { public Vector3 Position; public Vector3 Rotation; public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter { serializer.SerializeValue(ref Position); serializer.SerializeValue(ref Rotation); } } public class PlayerNetwork : NetworkBehaviour { [SerializeField] private bool usingServerAuth; private NetworkVariable<PlayerNetworkState> playerState; private Rigidbody playerRb; private void Awake() { playerRb = GetComponent<Rigidbody>(); var permission = usingServerAuth ? NetworkVariableWritePermission.Server : NetworkVariableWritePermission.Owner; playerState = new NetworkVariable<PlayerNetworkState>(new PlayerNetworkState {Position = Vector3.zero, Rotation = Vector3.zero}, NetworkVariableReadPermission.Everyone, permission); } public override void OnNetworkSpawn() { if (!IsOwner) { Destroy(transform.GetComponent<Player>()); Destroy(transform.GetComponent<CamController>()); } } private void Update() { if (IsOwner) TransmitState(); else ConsumeState(); } #region Transmit State private void TransmitState() { var state = new PlayerNetworkState { Position = playerRb.position, Rotation = transform.rotation.eulerAngles }; if (IsServer || !usingServerAuth) { playerState.Value = state; } else { TransmitStateServerRpc(state); } } [ServerRpc(RequireOwnership = false)] private void TransmitStateServerRpc(PlayerNetworkState state) { playerState.Value = state; } #endregion #region Consume State private void ConsumeState() { transform.position = playerState.Value.Position; transform.rotation = Quaternion.Euler(playerState.Value.Rotation); } #endregion }
第二:
using System.Collections; using System.Collections.Generic; using Unity.Netcode; using UnityEngine; public class Player : NetworkBehaviour { private Rigidbody playerRb; public GameObject camHolderPrfb; public GameObject camHolder; public float speed; void Start() { camHolder = Instantiate(camHolderPrfb, transform.position, Quaternion.identity); playerRb = GetComponent<Rigidbody>(); } void Update() { //Makes sure player can only control its character if (!IsOwner) {return;} //Calculates player movement float forwInput = Input.GetAxis("Vertical"); float horzInput = Input.GetAxis("Horizontal"); Vector3 direction = camHolder.transform.forward * forwInput + camHolder.transform.right * horzInput; //Applies movement to player if (direction.magnitude > 1) {direction.Normalize();} playerRb.AddForce(direction * speed); } }
第三:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Unity.Netcode; public class CamController : NetworkBehaviour { public float rotationSpeed; public float lerpSpeed; public GameObject camHolder; private Camera playerCamComp; private GameObject playerCam; public Player PlayerScr; void Start() { camHolder = PlayerScr.camHolder; playerCamComp = camHolder.GetComponentInChildren<Camera>(); playerCam = playerCamComp.gameObject; } void FixedUpdate() { //Camera is rotatable with left and right keys float camInput = Input.GetAxis("MoveCam"); camHolder.transform.Rotate(Vector3.up, camInput * Time.deltaTime * rotationSpeed); //Camera moves and looks at the player camHolder.transform.position = Vector3.Lerp(camHolder.transform.position, transform.position, lerpSpeed * Time.deltaTime); playerCam.transform.LookAt(this.transform); } }
所有脚本都分配给了玩家。还有一个脚本,当单击其中一个按钮时,它会生成启动主机、服务器和客户端按钮并停用主摄像头,这样玩家摄像头就可以代替它。如果您可能需要这个,请告诉我。绝对没有任何错误可以引导我朝着正确的方向前进,我甚至不知道在哪里添加日志进行调试。