背景
我有一个应用程序,要求我在无头ROS环境中启动几个RViz窗口。系统需要将图像文件发送到一些本地联网的哑终端,这些终端几乎不能充分显示图像文件(.jpg(。因此,我只需拍摄RViz显示器的屏幕快照并发送这些快照。这工作得很好,但是,我需要在启动时运行RViz窗口。
实施
ROS noetic系统在Ubuntu 20.04上运行。我使用robot_supstart为systemd服务提供了一个工作框架,然后修改了核心服务文件,允许display_manager访问
这是我的工作系统.d服务文件,名为"test.service">
[Unit]
Description="bringup test"
After=network.target
After=display_manager.service
Wants=display_manager.service
[Service]
Type=simple
Environment="XAUTHORITY=/run/user/1000/gdm/Xauthority"
Environment="DISPLAY=:0"
Environment="XDG_RUNTIME_DIR=/home/<my_username/catkin_ws/tmp"
Environment="/home/<my_username>" # THIS FIXED THE ISSUE
ExecStart=/usr/sbin/test-start
[Install]
WantedBy=multi-user.target
这几乎工作。journalctl -f -u test.service
列出一个错误:
Jun 06 21:10:22 aoede test-start[10209]: /opt/ros/noetic/lib/rviz/rviz: line 1: 10220 Aborted (core dumped) $0 $@
Jun 06 21:10:25 aoede dbus-daemon[10259]: [session uid=1000 pid=10257] AppArmor D-Bus mediation is enabled
Jun 06 21:10:28 aoede test-start[10237]: terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
Jun 06 21:10:28 aoede test-start[10237]: what(): boost::filesystem::create_directory: Permission denied: "/.rviz"
Jun 06 21:10:28 aoede test-start[10218]: Aborted (core dumped)
它正在尝试写入目录/.rviz
。当我用宽松的权限自己创建这个目录时,它就会正常工作,RViz窗口就会全部启动。这个目录中似乎充满了RViz实例的持久性文件。
我已经尝试过如上设置XDG_RUNTIME_DIR,但没有效果。我应该设置什么环境变量,或者以其他方式,使RViz看起来更合理?此外,如果能就比上述更好的做法提出任何建议,我将不胜感激。
所需的环境变量是$HOME这是在服务运行后设置的,因此不可用。
Environment="/home/<my_username>"
修复问题