小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
驱动雷达报错
-
问题描述:
驱动雷达报错
具体细节和上下文:
输入:
xhost + && sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged -v /tmp/.X11-unix:/tmp/.X11-unix --device /dev/snd -e DISPLAY=unix$DISPLAY -p 8889:8888 registry.cn-hangzhou.aliyuncs.com/fishros/fishbot_laser选择1
返回:
UART2SOCKET:8888->/tmp/fishbot_laser
Prepare to Accept connect!
3 <socket.socket fd=6, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('172.17.0.3', 8888), raddr=('192.168.0.104', 49950)> 4
PTY: Opened /dev/pts/6 for 0.0.0.0:8888
[YDLIDAR INFO] Current ROS Driver Version: 1.4.5
[YDLIDAR]:SDK Version: 1.4.5
[YDLIDAR]:Lidar running correctly ! The health status: good
[YDLIDAR] Connection established in [/tmp/fishbot_laser][115200]:
Firmware version: 1.5
Hardware version: 1
Model: S4
Serial: 2021031700000035
[YDLIDAR]:Fixed Size: 340
[YDLIDAR]:Sample Rate: 3K
[YDLIDAR INFO] Current Sampling Rate : 3K
[YDLIDAR INFO] Now YDLIDAR is scanning ......
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc尝试过的解决方法:
模式已切换,网络环境正常,没有scan topic
参考资料:
https://blog.csdn.net/aibao_b/article/details/135238698 -
std::bad_alloc
异常在C++程序中通常表示内存分配失败。这可能是因为系统内存不足,或者程序试图分配比可用内存更大的内存块。在你给出的场景中,这个问题发生在运行一个Docker容器内的ROS激光雷达驱动程序时。以下是一些建议的解决步骤:
-
检查系统资源:
- 确保你的系统有足够的可用内存和交换空间。
- 使用
free -h
或top
命令来检查内存使用情况。 - 如果可能的话,关闭一些不必要的程序或服务以释放内存。
-
调整Docker容器内存限制:
- Docker容器默认没有内存限制,但你可以设置限制。如果设置了限制并且它太低,可能会导致
std::bad_alloc
异常。你可以使用--memory
标志来增加内存限制。
- Docker容器默认没有内存限制,但你可以设置限制。如果设置了限制并且它太低,可能会导致
-
检查Docker容器内进程:
- 使用
docker exec -it <container_id> bash
进入容器内部。 - 使用
top
或htop
命令检查容器内的内存使用情况。 - 如果发现有进程占用了大量内存,考虑优化它或杀死它。
- 使用
-
检查ROS节点内存使用:
- 如果可能的话,使用ROS的内存分析工具(如
rostopic bw
、rosnode info
)来检查哪个节点可能在使用大量内存。
- 如果可能的话,使用ROS的内存分析工具(如
-
更新或修复程序:
- 如果这个问题是由程序中的一个bug引起的,尝试更新到最新版本的ROS驱动程序。
- 检查是否有已知的bug修复或内存管理优化。
-
检查Docker卷和设备挂载:
- 确保
/dev
、/dev/shm
和/tmp/.X11-unix
等卷和设备被正确挂载,并且没有权限问题。
- 确保
-
查看日志和错误消息:
- 检查ROS日志和Docker容器日志,看是否有更详细的错误信息。
- 这可能会给你关于问题来源的更多线索。
-
搜索相关错误:
- 在线搜索
std::bad_alloc
和ROS激光雷达驱动程序的组合,看看是否有其他人遇到过类似的问题并找到了解决方案。
- 在线搜索
-
联系支持:
- 如果以上步骤都不能解决问题,考虑联系ROS社区或激光雷达驱动程序的开发者支持。
最后,注意你提供的命令中使用了
--privileged
标志,这会给容器几乎所有的宿主机权限。虽然这有时是必要的,但它也增加了安全风险。确保你了解这个标志的含义,并在可能的情况下避免使用它。
以上为生成回答,仅供参考~
-
-
@763141425 虚拟机还是实体机,电脑内存硬盘配置是什么样子的,这个看起来不太相关网络问题,不过最好也提供一下网络结构
-
@小鱼 实体机,16G内存,256G硬盘,电脑通过网线连接路由器,可以PING通雷达。
输入~$ ros2 topic list
反馈:/parameter_events
/rosout
/scan
这一步都是正常的再输入ros2 topic hz /scan
雷达驱动的终端就报错了 -
@小鱼 换了两台电脑都这样
-
@763141425 报什么错呢
-
@小鱼 terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc -
完整的代码:
- 驱动雷达
- 建图测试
- 退出
#? 1
UART2SOCKET:8888->/tmp/fishbot_laser
Prepare to Accept connect!
3 <socket.socket fd=6, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('172.17.0.3', 8888), raddr=('192.168.0.105', 55719)> 4
PTY: Opened /dev/pts/6 for 0.0.0.0:8888
[YDLIDAR INFO] Current ROS Driver Version: 1.4.5
[YDLIDAR]:SDK Version: 1.4.5
[YDLIDAR]:Lidar running correctly ! The health status: good
[YDLIDAR] Connection established in [/tmp/fishbot_laser][115200]:
Firmware version: 1.5
Hardware version: 1
Model: S4
Serial: 2021031700000035
[YDLIDAR]:Fixed Size: 330
[YDLIDAR]:Sample Rate: 3K
[YDLIDAR INFO] Current Sampling Rate : 3K
[YDLIDAR INFO] Now YDLIDAR is scanning ......
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
^CTraceback (most recent call last):
File "/workspace/install/fishbot_laser_driver/lib/fishbot_laser_driver/laser_x2", line 33, in <module>
sys.exit(load_entry_point('fishbot-laser-driver==0.0.0', 'console_scripts', 'laser_x2')())
File "/workspace/install/fishbot_laser_driver/lib/python3.10/site-packages/fishbot_laser_driver/fishbot_laser_x2.py", line 83, in main
SocketServer()
File "/workspace/install/fishbot_laser_driver/lib/python3.10/site-packages/fishbot_laser_driver/fishbot_laser_x2.py", line 35, in init
self.main()
File "/workspace/install/fishbot_laser_driver/lib/python3.10/site-packages/fishbot_laser_driver/fishbot_laser_x2.py", line 68, in main
os.write(write_fd, data)
KeyboardInterrupt
[ros2run]: Interrupt
-
-
系统是Ubuntu 24.04,ros2是jazzy。
-
@763141425 请使用humble
-
-
@763141425 是的,换22