数。????????应该不是. Talker与listener也没有加???? 后来又测试,发现不加'/'就不显示图像。
4. 不需要对CMakeList.txt & package.xml做什么, 直接catkin_make一下. 从该包中也可
以学习到如何在有多个.h与.cpp的情况下编译节点. 成功则提示:
Scanning dependencies of target usb_cam
[ 50%] Building CXX object usb_cam/CMakeFiles/usb_cam.dir/src/usb_cam.cpp.o Linking CXX shared library /home/listname/catkin_ws_usbcam/devel/lib/libusb_cam.so [ 50%] Built target usb_camScanning dependencies of target usb_cam_node
[100%] Building CXX object usb_cam/CMakeFiles/usb_cam_node.dir/nodes/usb_cam_node.cpp.o Linking CXX executable /home/listname/catkin_ws_usbcam/devel/lib/usb_cam/usb_cam_node [100%] Built target usb_cam_node
结果是产生了节点 devel/lib/usb_cam/usb_cam_node
在该生成过程中, usb_cam.cpp文件只是作为源文件,不需要生成节点. 5. 执行该节点:
$ source ~/catkin_ws_usbcam/devel/setup.bash $ rosrun usb_cam usb_cam_node
执行结果为
[ INFO] [1395144361.890765227]: Camera name: head_camera [ INFO] [1395144361.890932369]: Camera info url:
[ INFO] [1395144361.891021666]: usb_cam video_device set to [/dev/video0] [ INFO] [1395144361.891108635]: usb_cam io_method set to [mmap] [ INFO] [1395144361.891196215]: usb_cam image_width set to [640] [ INFO] [1395144361.891275158]: usb_cam image_height set to [480] [ INFO] [1395144361.891358759]: usb_cam pixel_format set to [mjpeg] [ INFO] [1395144361.891524348]: usb_cam auto_focus set to [0] [ INFO] [1395144362.218432362]: using default calibration URL [ INFO] [1395144362.218573782]: camera calibration URL: file:///home/listname/.ros/camera_info/head_camera.yaml [ INFO] [1395144362.218806683]: Unable to open camera calibration file [/home/listname/.ros/camera_info/head_camera.yaml]//不用管这行
[ WARN] [1395144362.218924552]: Camera calibration file /home/listname/.ros/camera_info/head_camera.yaml not found.//这一行应该没关系, 连接kinect时也会提示
内置摄像头的指示灯确实亮了, ctrl+c后就灭了, 说明应该已经获得图像了. 若要将发布的图像显示出来,请见下方.
图像的接收与显示: 在原有catkin_ws_cvbridge工作空间上进行改动: 1. 编写接收图像节点的源代码image_converter_usbcam.cpp:
a) 复制image_converter.cpp为image_converter_usbcam.cpp。
b) 注意将subscribe中的话题名称\改为usb_cam_node发布的\
/image_raw\可以参照openTLD中的launch文件,编写launch文件????? c) 其它的不需要改动
2. 生成节点image_converter_usbcam:
a) 对CMakeList.txt加入如下几句命令, package.xml不需要改动
add_executable(image_converter_usbcam src/image_converter_usbcam.cpp) target_link_libraries(image_converter_usbcam ${catkin_LIBRARIES})
add_dependencies(image_converter_usbcam cvbridge_generate_messages_cpp) b) $ catkin_make 3. 执行该节点:
source ~/catkin_ws_cvbridge/devel/setup.bash rosrun cvbridge image_converter_usbcam
以后若想随时运行, 操作方法:
16
1. 2.
进入工作空间UsbCam, 运行rosrun usb_cam usb_cam_node
进入工作空间CvBridge, 运行rosrun cvbridge image_converter_usbcam
外接USB摄像头图像获取
图像Topic的发布: 与内置USB摄像头的图像发布相似:利用包usb_cam及其节点usb_cam_node.
1. 源文件: 对于usb_cam包中usb_cam_node.cpp的唯一一处作修改: 由于外接USB摄像头的
设备名为video1,因此将设备名的语句修改为 node_.param(\video_device_name_, std::string(\2. 生成与执行该节点
~/catkin_ws_usbcam$ catkin_make
source ~/catkin_ws_usbcam/devel/setup.bash
~/catkin_ws_usbcam$ rosrun usb_cam usb_cam_node 3.
图像Topic的发布: 单独建一个工作空间(上方步骤的重复),为了避免混乱:
作用: 将外置USB摄像头的图像发布到一个Topic上, 消息类型为sensor_msgs::Image.
1. 创建UsbCamExternal工作空间
2. 下载usb_cam包:进入src文件夹,运行git clone https://github.com/bosch-ros-pkg/usb_cam.git
3. ../nodes/usb_cam_node.cpp:
a。外置USB摄像头的设备名称为video1. 关于设备名称的语句该为
node_.param(\b。发布话题名称改为image_sub_ = it_.subscribe(\&ImageConverter::imageCb, this);
4. catkin_make 5. 执行该节点:
$ source ~/UsbCamExternal/devel/setup.bash $ rosrun usb_cam usb_cam_node
出现如下error, 但运行cvbridge后也能正常显示图像 [mjpeg @ 0xe43b60] error count: 64
[mjpeg @ 0xe43b60] error y=31 x=3
图像的接收与显示: 与内置USB摄像头的图像显示严格一致.
在CvBridge工作空间下,执行该节点: (不用再catkin_make了,因为与获得内置USB摄像头图像的节点一样)
1. source ~/catkin_ws_cvbridge/devel/setup.bash 2. rosrun cvbridge image_converter_usbcam
KinectSkeleton
Openni_tracker http://wiki.ros.org/openni_tracker
openni_tracker是一个单列的包, 之前在openni_kinect中, 现在openni_kinect已经被ROS抛弃了.
17
1. 创建工作空间: mkdir -p ~/OpenniTracker/src
2. 进入src文件夹, 下载包:git clone https://github.com/ros-drivers/openni_tracker.git
成功则提示
Cloning into 'openni_tracker'...
remote: Reusing existing pack: 67, done. remote: Total 67 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (67/67), done.
3. 生成: 使用命令: catkin_make, 也生成了CMakeList.txt链接文件
a) 但提示失败:提示缺少Nite_INCLUDEDIR和Nite_LIBRARY. 因此需要安装NiTE
了. 安装过程见下方.
b) 安装v1.5的以后, 不对CMakeList文件做任何修改,再运行catkin_make能生成。 4. 执行该节点
a) 初始化kinect: roslaunch turtlebot_bringup 3dsensor.launch //不用初始化的话
openni_tracker节点也能正常运行,是用了Nite的缘故? 但若用RViz时, 就得需要初始化kinect了,否则软件中就没有信息只有个Grid b) source devel/setup.bash
c) rosrun openni_tracker openni_tracker //总是不识别, 得手动敲入了
5. 运行结果: 本以为执行无反应, 其实是该包根本就没有网页上的图像示例(误导使用
者了),有人走过时, 在terminal中才显示, 这个让我长时间误认为程序无法运行: New User 1//用户走入
Pose Psi detected for user 1 //没有这句话啊 Calibration started for user 1
Calibration complete, start tracking user 1 Lost User 1 //用户走出 安装NiTE:不知怎么回事,v2.2,v2.1,运行./install.sh都没有反应, 只能用v1.5了(Bluts给的),运行sudo ./install.sh就立马安装完毕了(就是将.h,.cpp,lib文件复制到相应程序文件夹中了),就对应上了opencv_tracker -> CMakeList.txt中的
find_path(Nite_INCLUDEDIR NAMES XnVNite.h HINTS/usr/include/nite /usr/local/include/nite) find_library(Nite_LIBRARY NAMES XnVNite_1_3_1, HINTS /usr/lib /usr/local/lib PATH_SUFFIXES lib)
不过注意文件NAMES -> XnVNite_1_3_1等效于libXnVNite_1_3_1.so???
在RViz中显示坐标系与点云: 需要做修改(Bluts): 1. openni_tracker.cpp中string frame_id(\改为string
frame_id(\//在RViz中,Grid的frame之一就是 camera_depth_frame
2. 3dsensor.launch文件中, publish_tf对应的false改为了true, 意义是什么???
a) 进入文件夹所在路径:/opt/ros/hydro/share/turtlebot_bringup/launch b) 修改命令为:sudo gedit 3dsensor.launch
RViz中:
1. 命令是rosrun rviz rviz. 结果显示:
[ INFO] [1395309973.626822675]: rviz version 1.10.11
[ INFO] [1395309973.626925690]: compiled against OGRE version 1.7.4 (Cthugha) [ INFO] [1395309974.034415316]: OpenGl version: 3 (GLSL 1.3). 2. 在RViz的界面中做如下设置:
a) Fixed Frame选择 camera_link , 这个是摄像机的基坐标系. b) TF:无
c) PointCloud2: Topic选择/camera/depth_registerd/points 3. 笔记: 有次运行,点云发暗, 再运行一次就正常了。
18
查看坐标系关系: frames.pdf 1. 若命令是: rosrun tf
显示如下结果:
tf tf2_geometry_msgs tf2_py tf_conversions tf2 tf2_kdl tf2_ros tf2_bullet tf2_msgs tf2_tools
2. 输出坐标系关系的命令: rosrun tf view_frames
结果是在Home文件夹下产生了frame.pdf: Listening to /tf for 5.000000 seconds Done Listening
dot - graphviz version 2.26.3 (20100126.1600) Detected dot version 2.26.3 frames.pdf generated
TF Listener(综合实现人体跟踪)
待实现的一环是: 以程序形式获取TF数据. 因此就可利用人体的空间位置来给P3AT发控制量.
tf2_ros/transform_broadcaster.cpp:
http://docs.ros.org/hydro/api/tf2_ros/html/c++/transform__broadcaster_8cpp_source.html 从cpp代码中, 可知消息类型为
publisher_ = node_.advertise
那么就可以根据该Topic接收了. 重点参考了hal中的程序aria_tf_listener.cpp.
tfTutorialsWriting a tf listener (C++)
http://wiki.ros.org/tf/Tutorials/Writing a tf listener (C++)
创建包: catkin_create_pkg TfListener std_msgs rospy roscpp tf。比”ROSARIA程序控制”一节多了tf.
1. 复制RosAriaCode中的rosaria_teleop_code.cpp(改名为TfListenerAria)到TfListener中来运行,catkin_make后没有问题。可以运行。 rosrun TfListener TfListenerAria
2. CMakeList.txt中加入:
add_executable(TfListenerAria src/TfListenerAria.cpp)
target_link_libraries(TfListenerAria ${catkin_LIBRARIES})
add_dependencies(TfListenerAria TfListener_generate_messages_cpp)
2. 加入头文件#include
[ERROR] [1395888613.400748574]: \passed to lookupTransform argument target_frame does not exist.
嗯,这也间接说明lookupTransform在运行, bringup Kinect后,提示
[ERROR] [1395888750.517122967]: \does not exist.
看来需要把“head”改为“head_1(2,3…)”, 不知程序从哪里加入了后缀”_1”.
需要运行openni_tracker:rosrun openni_tracker openni_tracker, 运行后则有: 1. depth camera的扫描红线出现了。
2. rviz中,出现了人体TF的信息,否则TF下无任何信息
19
在哪里吧openni_tracker.cpp中的\,\等, 改成了\的坐标系名称
将openni_tracker.cpp中的\改成\后,还得要把\改成\等,否则也提示没有找到\坐标系, 而且rviz里也不会出现\
对于TfListenerAria节点, 当Lost User X时,仍能收到Tf的信息,为什么???
读出”head_1”坐标系信息, 有:
[ INFO] [1395909978.699846534]: x: 2.339041, y: -1.016116, z: -0.421484 说明
x: 越近kinect越小(即深度信息), y:在kinect前,往右为正,往左为负 z:越下蹲,越负
总体步骤:
1. marvin上启动机器人: rosrun rosaria RosAria
(通过原先的ROSARIA程序控制方式来测试: rosrun RosAriaCode rosaria_teleop_code)
2. KinectSkeleton识别人体:
bringup Kinect: roslaunch turtlebot_bringup 3dsensor.launch(要打开电源啊,要插上USB线啊)
cd OpenniTracker/
rosrun openni_tracker openni_tracker
3. TfListener:根据人体的空间坐标给机器人发送命令 cd TfListener/
rosrun TfListener TfListenerAria
4. 若是通过网络传信息的话,需要在hal上启动RosAria: roscd ROSARIA
串口线插到下面的串口,上面的口应该是/dev/ttyS1 rosrun ROSARIA RosAria (再运行步骤2与3)
(通过原先的ROSARIA程序控制方式来测试: rosrun RosAriaCode rosaria_teleop_code. 但要把发布的消息由\改为\
说明: 通过网络控制时的Debug: 在hal上的RosAria, 虽然Topic是”cmd_vel”, 但其定义ROS::NodeHandle时带了”~”, 因此真正的Topic为”/RosAria/cmd_vel”. 因此TfListenerAria.cpp中的Topic也要为”/RosAria/cmd_vel”, 那为什么rosaria_teleop_code.cpp中的”cmd_vel”可以正常连接呢??? 该过程::
rosnode info /RosAria
------------------------------------------------------------------------------ Node [/RosAria] Publications:
* /rosout [rosgraph_msgs/Log] * /tf [tf/tfMessage]
20