机器人操作系统ROS_典型功能实现方法详解(4)

2019-03-28 12:01

数。????????应该不是. 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


机器人操作系统ROS_典型功能实现方法详解(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:微积分实验报告2

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: