平台:
ubuntu16.04
所用摄像头:
kinectv2(这很重要,v1就不需要那么麻烦了!!!!)
需要安装:
openNI2,NiViewer2,NiTE2
还有四个功能包:
kinect2_tracker kinect_based_arm_tracking 还有两个保密
openNI2安装
kinectv2安装那篇博客有:这里
NiViewer2安装
cd ~/libfreenect2/build
sudo apt-get install openni2-utils
sudo cmake ..
sudo make && sudo make install (optional)
sudo make install-openni2
NiViewer2
此处就会有摄像头的图像
NiTE2安装
说明:
NiTE2 是目前最先进最强大的3D计算机视觉中间件,拥有精简的主机,最小的CPU负载和多平台支持。该中间件为应用程序提供了一个清晰的用户控制API,包括基于手的和全身控件。 这些算法利用从硬件设备接收到的深度,颜色,IR和音频信息,使其能够执行手部定位和跟踪,场景分析器(将用户与背景分离),准确的用户骨架关节跟踪以及各种手势识别等等。
安装:
下载NiTE-2.0.0并解压:链接:https://pan.baidu.com/s/1NZkCL6--MfZORBQu9rTqUw 提取码:46pg
还有一个要下载:这里
在根目录下创建一个文件夹package_ws,把下载的第二个文件解压NiTE-Linux-x64-2.2放进去
cd NiTE-Linux-x64-2.2
sudo ./install.sh
此时该目录下会生成 NiTEDevEnvironment 文件,然后添加环境变量
cat NiTEDevEnvironment >> ~/.bashrc
执行下面的命令
sudo gedit ~/.bashrc
此时在最下面会出现两条路径信息
export NITE2_INCLUDE=/home/ubuntu/package_ws/NiTE-2.0.0/Include
export NITE2_REDIST64=/home/ubuntu/package_ws/NiTE-2.0.0/Redist
Include: 存放该库的头文件
Redist: 是一个高性能的key-value数据库,用于补充依赖的关系数据库
修改 OpenNI.ini 文件
cd Samples/Bin
sudo gedit OpenNI.ini
然后在文件末尾添加 OpenNI2 的 Drivers 路径信息
Repository=/usr/lib/OpenNI2/Drivers
运行节点
./UserViewer
关键的一步,我当时运行UserViewer也是打不开设备,所以才想到这一步的,cd到NiTE-2.0.0/Samples/Bin/下,看到有一个libOpenNI2.so,这是安装包自带的一个当然不行,于是我把OpenNI-Linux-x86-2.2/Redist下的libopenNI.so考过来replace掉原来的那个文件,在进到NiTE-2.0.0/Samples/Bin/下跑UserViewer时出现了想要的深度图,在前面移动一下还有Tracking的标签。
下载编译kinect2_tracker包
包的地址:这里
cd ~/your_workspace/src
git clone https://github.com/mcgi5sr2/kinect2_tracker.git
cd kinect2_tracker
source setup_nite.bash
然后到自己的工作空间文件夹编译:
catkin_make
成功后就可以测试运行了
测试kinect2_tracker:
现在如果一切正常,重新插拔kinect2设备后运行:
roslaunch kinect2_tracker tracker.launch
rosrun rviz rviz -d `rospack find rbx1_vision`/skeleton_frames.rviz
会报错:
[rospack] Error: package ‘rbx1_vision’ not found
去网上找到一个rbx1的ros功能包下载下来放进工作空间里,重新编译就可以
再次运行上面两句,就可以了
在rviz中就会显示到捕捉到的点,显示其中,
在kinect2_tracker包中,有以下接口:
Published
/people_skeleton : kinect2_tracker::user_IDs, id array of the tracked people
/people_points: kinect2_tracker::user_points, center of mass for each person
/people_points_viz: visualization_msgs::Marker, people points to show in rviz
tf transforms for the human skeletons
Kinect RGB, depth and infrad images
Params
tf_prefix: The prefirx when publishing tf
relative_frame: The base frame of the Kinect observations
kinect_based_arm_tracking功能包
包的地址:这里
这里还需要一个learning_tf包,自己编去,如果要的话,在评论留言
包放进去,然后编译,就可以了
后面就是登陆baxter
rosrun baxter_tools enable_robot.py -e
roslaunch kinect2_tracker tracker.launch
rosrun rviz rviz -d rospack find rbx1_vision
/skeleton_frames.rviz
调base_link
显示出号码,在代码中修改
rosrun kinect_based_arm_tracking tf_listen_v8_puber.py
rosrun kinect_based_arm_tracking tf_listen_v8_controller.py
就可以了
某些东西需要修改的
我们看到kinect_based_arm_tracking功能包中的kinect_based_arm_tracking tf_listen_v8_puber.py文件中的:
#tf part
listener = tf.TransformListener()
user_index = '1'
for_my_left_shoulder = 'right_shoulder_'+user_index
for_my_left_shoulder_x = 'left_shoulder_'+user_index
for_my_left_elbow = 'right_elbow_'+user_index
for_my_left_hand = 'right_hand_'+user_index
for_my_right_shoulder = 'left_shoulder_'+user_index
for_my_right_shoulder_x = 'right_shoulder_'+user_index
for_my_right_elbow = 'left_elbow_'+user_index
for_my_right_hand = 'left_hand_'+user_index
head = 'head_'+user_index
torso = 'torso_'+user_index
base = 'kinect_camera_frame'
这里所写的就是监听的kinect所追踪的人体骨架点话题名称格式,大致就是人体部位+人的编号
比如left_shoulder2 .
但是在kinect2_tracker包的kinect2_tracker.hpp文件中
std::stringstream j_frame_id_stream; //stringstream of frame id values
std::string j_frame_id; // string of the stringstream
j_frame_id_stream << "/" << tf_prefix_ << "/user_" << uid << "/" << j_name;
j_frame_id = j_frame_id_stream.str();
std::stringstream r_frame_id_stream; //stringstream of frame id values
std::string r_frame_id; // string of the stringstream
r_frame_id_stream << "/" << tf_prefix_ << "/user_" << uid << "/" << r_name;
r_frame_id = r_frame_id_stream.str();
可以看出,kinect2_tracker包所发布的的追踪到的人体部位位置话题名格式为: /坐标转换前缀/user_ 1(追踪到的人编号)/ j_name(关节名称);
所以,要保持前者监听的话题名和后者发布的话题名一致,随意要对kinect2_tracker.hpp做出改动:
j_frame_id_stream << j_name << "_" << uid;
j_frame_id = j_frame_id_stream.str();
std::stringstream r_frame_id_stream; //stringstream of frame id values
std::string r_frame_id; // string of the stringstream
r_frame_id_stream << r_name << "_" << uid;
r_frame_id = r_frame_id_stream.str();
同理下面有几行也得改(下面是已经修改的):
std::stringstream calibration_frame_id_stream; //stringstream of frame id values
std::string calibration_frame_id; // string of the stringstream
calibration_frame_id_stream << "/calibrationOrigin_" << uid;
calibration_frame_id = calibration_frame_id_stream.str();
std::stringstream r_frame_id_stream; //stringstream of frame id values
std::string r_frame_id; // string of the stringstream
r_frame_id_stream << "/torso_" << uid;
r_frame_id = r_frame_id_stream.str();
这样就可以实现baxter与人动作跟随了
总结
在安装nite,必须在根目录下创建package_ws文件夹,然后把解压出的文件夹放进去,因为这关系到kinect2_tracker后续的编译安装,如果是自己定义文件夹放进去,按照github上要修改kinect2_tracker编译文件中的代码(按照这里修改),但我当时也是放在自己定义的文件夹里,编译kinect2_tracker功能包一直不能通过,有可能没改对,后面就用这个比较傻的办法,就安装kinect2_tracker成功了。
如果用的是kinectv1,就不用那么麻烦去改上面的代码了,因为v2发布的话题名与v1太不一样了,而网上大部分对kinect写的动作追踪功能包和baxter官网放的动作跟随kinect_based_arm_tracking功能包都是基于v1的,所以造成了很多麻烦。如果用kinectv1的,就按照官网的一步一步来就好了。