一、代码例子
#!/bin/bash
# 确保ROS环境已经设置好
source /home/handsfree/.bashrc
source /opt/ros/noetic/setup.bash
# <<< fishros initialize <<<
source /home/handsfree/catkin_ws/devel/setup.bash
export ROS_HOME="handsfree"
export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
#export PATH="/home/handsfree/anaconda3/envs/yolov5/bin/python:$PATH"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib/HCNetSDKCom
# 确保ROS环境已经设置好
workdir=/home/handsfree/Desktop
workdir2=/home/handsfree/catkin_ws/src/face_recognition/scripts
workdir3=/home/handsfree/catkin_ws/src/robot_voice/src
# 添加 Qt 环境变量
export PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/qml:$QML2_IMPORT_PATH
# 打印当前工作目录
echo "Current working directory: $(pwd)"
# 启动 usb_cam 节点
cd $workdir
roslaunch usb_cam cam_test.launch &
# 新建一个终端窗口并运行语言转换
gnome-terminal -- bash -c "cd $workdir; roslaunch vision callyou.launch;exec bash"
二、代码分析
1. 设置 ROS 环境
source /home/handsfree/.bashrc
source /opt/ros/noetic/setup.bash
-
source /home/handsfree/.bashrc
: 这行命令源自~/.bashrc
文件,通常用于在 Bash 启动时设置用户的环境变量或执行初始化脚本。通过执行source
,系统将加载其中的设置,确保用户的环境变量和其他设置得以生效。 -
source /opt/ros/noetic/setup.bash
: 这行命令加载 ROS Noetic 的环境变量,使得 ROS 命令(如roslaunch
,roscore
等)可以在当前终端中运行。/opt/ros/noetic/setup.bash
是 ROS Noetic 安装时自动生成的环境配置文件路径。
2. 设置 Catkin 工作空间环境
source /home/handsfree/catkin_ws/devel/setup.bash
- 这行命令加载 Catkin 工作空间(通常是 ROS 的构建系统)的环境设置,使得在
catkin_ws
工作空间中的包可以正常工作。执行该命令后,rosrun
、roslaunch
等命令会知道在哪些路径中查找 ROS 包。
3. 设置 ROS_HOME 环境变量
export ROS_HOME="handsfree"
export ROS_HOME="handsfree"
: 这行命令设置ROS_HOME
环境变量为handsfree
,这可能是一个自定义的路径或设置。它用于指定 ROS 的工作目录,通常 ROS 会在这个目录下存储一些文件。
4. 设置 CUDA 环境变量
export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-
export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
: 这行命令将 CUDA 11.4 的bin
目录添加到系统的PATH
环境变量中,确保在终端中能够找到 CUDA 相关的工具(如nvcc
)。 -
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
: 这行命令将 CUDA 11.4 的lib64
目录添加到LD_LIBRARY_PATH
中,确保系统在运行时能够找到 CUDA 的共享库。
5. 注释掉的 Anaconda 环境变量
#export PATH="/home/handsfree/anaconda3/envs/yolov5/bin/python:$PATH"
- 这行被注释掉的代码将 Anaconda 环境下的 Python 可执行文件目录添加到
PATH
中。虽然被注释掉了,但如果取消注释,它将确保在当前终端会话中使用 Anaconda 环境中的 Python。
6. 设置共享库搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5
-
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu
: 将/usr/lib/x86_64-linux-gnu
添加到LD_LIBRARY_PATH
中,确保系统能够找到其他共享库。 -
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5
: 这行命令将libtiff.so.5
共享库强制加载到当前程序的内存中。这通常用于解决库冲突或确保特定库被优先加载。
7. 设置 Hikvision ROS 驱动的库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib/HCNetSDKCom
- 这两行将 Hikvision ROS 驱动的共享库路径添加到
LD_LIBRARY_PATH
中,确保 ROS 节点在运行时能够找到 Hikvision 相关的库文件。
8. 启动另一个终端运行 ROS 节点
gnome-terminal -- bash -c "cd $workdir; roslaunch vision callyou.launch; exec bash"
-
gnome-terminal -- bash -c "..."
: 这条命令通过gnome-terminal
启动一个新的终端窗口,并在该终端中执行给定的命令。 -
gnome-terminal
是 GNOME 桌面环境下的终端模拟器命令。它用于启动一个新的终端窗口。在这个命令中,gnome-terminal
将打开一个新的终端窗口并执行接下来的命令。 -
bash
:这个参数告诉gnome-terminal
启动一个新的 Bash shell。也就是说,在新的终端窗口中,将运行一个新的 Bash shell 会话。 -
-c "..."
:-c
是 Bash 命令行的一个选项,表示让 Bash 执行其后跟着的字符串作为命令。"..."
中的内容是一个 Bash 命令序列,这些命令会在新的 Bash 会话中执行。- 注意 : 如果没有
-c
,Bash 会直接进入交互式模式,而不是执行给定的命令。
-
cd $workdir; roslaunch vision callyou.launch; exce bash
: 在新的终端中,首先切换到$workdir
目录,然后启动vision
包中的callyou.launch
文件,最后执行一个新的bash
会话 -
exec bash
:-
exec
是一个 shell 内置命令,用来替换当前的进程。它会启动一个新的进程并取代当前进程,而不是像普通命令那样在当前 shell 中执行。 -
在这里,
exec bash
启动一个新的 Bash shell,取代当前执行的 Bash 进程。这意味着当roslaunch
执行完后,终端会保持在一个交互式 Bash 会话中。通过exec bash
,你能够在新的终端中继续交互式操作,而不会退出终端。 -
exec
的作用是确保终端窗口保持打开状态,而不是在执行完roslaunch
后自动关闭。
-