En|中文
本项目完全来源于Ashesh Jain等人的论文,在论文中,作者提出了一种通用方法,用来将高层次的时空结构引入递归神经网络(Recurrent Neural Networks, RNNs),称之为结构化递归神经网络(Structural-RNN, S-RNN)。这种方法在处理一些跟时空有关的问题时,效果有显著的提升,如:人类运动建模、人类物体交互、驾驶动机预测等。在本项目中,S-RNN方法被引入到ROS中用于做人类运动预测。
访问S-RNN的项目主页了解详情:Structural-RNN: Deep Learning on Spatio-Temporal Graphs
建议使用conda创建虚拟环境,在虚拟环境中安装python依赖。
-
ROS (Kinetic Kame on Ubuntu 16.04 or Melodic Morenia on Ubuntu 18.04)
访问官方安装教程了解如何安装ROS。
-
Python (2.7)
-
Theano (>=0.6)
-
matplotlib
-
Neural Models (https://github.com/asheshjain399/NeuralModels)
Create an virtual environment named ros_srnn in conda:
> # 创建conda虚拟环境并安装依赖
> conda create -n ros_srnn python=2.7 Theano matplotlib
> # 激活虚拟环境
> conda activate ros_srnn
> # 安装rosinstall(在conda虚拟环境下需要)
> pip install rosinstall
> # 安装 Neural Models
> git clone https://github.com/asheshjain399/NeuralModels.git
> cd NeuralModels
> git checkout srnn
> python setup.py develop
你可能需要创建一些目录来存放这些文件。
在后文中将用DATASET_PATH来指代数据集路径。
用CHECKPOINTS_PATH来指代预训练模型的路径。
- 创建ROS工作空间
> mkdir -p ros_srnn_ws/src && cd ros_srnn_ws > catkin_make > source devel/setup.bash
- 克隆项目代码
> git clone https://github.com/chenhaowen01/srnn_human_motion_predict_for_ros.git src/srnn_human_motion_predict_for_ros
- 编译
> catkin_make
- 运行
rviz随后会运行起来,里面便可以看到两个运动中的人体骨架。一个是真实的运动,另一个是预测的运动。
> # 运行predictor节点,可能需要比较长的时间,请等待模型加载完成。Checkpoint文件路径也可以通过ROS参数checkpoint_path指定。 > roslaunch srnn_human_motion_predict_for_ros predictor.launch checkpoint_path:=CHECKPOINTS_PATH/srnn_walking/checkpoint.pik > # 在predictor节点加载完成之后,运行publisher节点。以下命令可能需要打开一个新的终端窗口来运行。数据集路径也可以通过ROS参数motion_dataset_path指定。 > roslaunch srnn_human_motion_predict_for_ros motion_publisher.launch motion_dataset_path:=DATASET_PATH/dataset/S7/walking_1.txt > # 运行可视化节点查看结果。以下命令可能需要打开一个新的终端窗口来运行。 > roslaunch srnn_human_motion_predict_for_ros visulize.launch
在项目中,使用了多个ROS节点来完成人类运动的预测。
- human_motion_publisher 节点: 这个节点读取并解析H3.6m数据集中的人体运动数据,随后将这些数据发布到一个ROS话题motion_skeleto中。实际上,这个节点是模仿了一个人体运动捕获系统。可以通过ROS参数frames_interval来控制数据发布的速率。
- human_motion_predictor 节点:
这个节点从话题motion_skeleto获得真实的人体运动数据,利用这些数据来预测之后的人体运动,并将结果发布到ROS话题predicted_motion_skeleto。预测算法使用结构化递归神经网络(S-RNN)(代码来自RNNexp)。可以通过如下ROS参数来控制预测过程:
- checkpoint_path:预训练模型的路径;
- prefix_sequence_length:用于预测的真实人体数据的序列长度;
- predicted_sequence_length:预测数据的序列长度。
- motion_tf_broadcaster 节点: 这个节点从ROS话题motion_skeleto和predicted_motion_skeleto订阅数据,转换数据格式然后将真实的、预测的人体运动数据通过tf广播出去,以便随后在rviz中将结果可视化。
这些节点之间的关系可以如下图表示:
-
为什么motion publisher节点以很低的速率发布运动数据?
受限于硬件,完成一次预测需要很长时间,因此我们只能以较低的速率来发布数据。如果你有足够的计算资源,可以通过修改ROS参数frames_interval来使publisher节点运行在一个较高的速率。
-
我可以使用GPU来加速预测过程吗?
当然可以,在通过roslaunch运行predictor节点时,可以通过指定命令行参数device(默认是cpu)来获得GPU加速。例如:
> roslaunch srnn_human_motion_predict_for_ros predictor.launch checkpoint_path:=CHECKPOINTS_PATH/srnn_walking/checkpoint.pik device:=cuda0