Baxter实战 实现kinect v2实现动作跟随

平台:
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的,就按照官网的一步一步来就好了。

你好,我是 C 知道,我可以回答你的问题。以下是 Python 编写动作跟随程序的示例代码: ```python import cv2 import mediapipe as mp # 初始化 Mediapipe 的 Pose 模型 mp_pose = mp.solutions.pose pose = mp_pose.Pose() # 打开摄像头 cap = cv2.VideoCapture() while True: # 读取摄像头的一帧图像 ret, frame = cap.read() # 将图像转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用 Mediapipe 的 Pose 模型检测人体姿势 results = pose.process(gray) # 如果检测到了人体姿势 if results.pose_landmarks: # 获取头部和手部的关键点坐标 head_x = results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].x head_y = results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].y left_hand_x = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST].x left_hand_y = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST].y right_hand_x = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST].x right_hand_y = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST].y # 计算头部和手部的相对位置 left_hand_dx = left_hand_x - head_x left_hand_dy = left_hand_y - head_y right_hand_dx = right_hand_x - head_x right_hand_dy = right_hand_y - head_y # 根据手部的相对位置控制动作 if left_hand_dx > .1: print("向右转头") elif left_hand_dx < -.1: print("向左转头") elif left_hand_dy > .1: print("向上抬头") elif left_hand_dy < -.1: print("向下低头") elif right_hand_dx > .1: print("向右转身") elif right_hand_dx < -.1: print("向左转身") elif right_hand_dy > .1: print("向上抬手") elif right_hand_dy < -.1: print("向下放手") # 显示图像 cv2.imshow("frame", frame) # 按下 q 键退出程序 if cv2.waitKey(1) == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ``` 这个程序使用 Mediapipe 的 Pose 模型检测人体姿势,然后根据手部的相对位置控制动作。你可以根据自己的需求修改程序。希望能帮到你!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值