机器人操作系统 ROS: 典型功能代码详解
李宝全
目录
目录..................................................................................................................................................................................................................... 1
ROS API 介绍 ...................................................................................................................................................................................................... 3
Demo ....................................................................................................................................................................................................................3
//talker.cpp..................................................................................................................................................................................................3
//listener.cpp ...............................................................................................................................................................................................4
//add_two_ints_server.cpp........................................................................................................................................................................ 4
//add_two_int_client.cpp........................................................................................................................................................................... 5
#CmakeList.txt.............................................................................................................................................................................................5
ROSARIA...............................................................................................................................................................................................................9
1//RosAria.cpp.............................................................................................................................................................................................9
#CmakeList.txt...........................................................................................................................................................................................20
2//rosaria_teleop_key.cpp ........................................................................................................................................................................20
3//rosaria_teleop_code.cpp..................................................................................................................................................................... 21
#CmakeList.txt...........................................................................................................................................................................................22
Images................................................................................................................................................................................................................26
//image_converter.cpp //包 cv_bridge 仅有的一个程序 ...................................................................................................................... 26
//hud_gui_simplified.cpp ..........................................................................................................................................................................27
//usb_cam.h .............................................................................................................................................................................................. 28
//usb_cam.cpp.......................................................................................................................................................................................... 29
//usb_cam_node.cpp................................................................................................................................................................................45
#usb_cam/CmakeList.txt ...........................................................................................................................................................................48
NiTE, Tf 的发布..................................................................................................................................................................................................49
//tf2_ros/transform_broadcaster.h 系统................................................................................................................................................49
//tf2_ros/transform_broadcaster.cpp 系统.............................................................................................................................................50
//tf/transform_broadcaster.h...................................................................................................................................................................50
//tf/transform_broadcaster.cpp...............................................................................................................................................................51
//tf2_ros/transform_listener.h.................................................................................................................................................................52
//tf/transform_listener.h .......................................................................................................................................................................... 53
//openni_tracker.cpp 节点 .......................................................................................................................................................................55
#CmakeList.txt...........................................................................................................................................................................................59
Tf 的接收, 并以控制 P3AT 做示范..................................................................................................................................................................60
//TfListnerAria.cpp.................................................................................................................................................................................... 60
#CmakeList.txt...........................................................................................................................................................................................61
语音发布........................................................................................................................................................................................................... 61
//sound_play.h..........................................................................................................................................................................................61
//SoundDemo.cpp.....................................................................................................................................................................................64
#CmakeList.txt...........................................................................................................................................................................................65
#test/CmakeList.txt................................................................................................................................................................................... 66
语言接收, 显示/再发声...................................................................................................................................................................................66
//VoiceBridgeNode.cpp.............................................................................................................................................................................66
#CMakeList.txt ...........................................................................................................................................................................................66
//RespondVoice.cpp ..................................................................................................................................................................................67
#test/CMakeList.txt ...................................................................................................................................................................................68
ROS_OpenTLD-GUI ............................................................................................................................................................................................ 68
//tld_gui_node.cpp................................................................................................................................................................................... 68
//base_frame.hpp..................................................................................................................................................................................... 68
//base_frame.cpp......................................................................................................................................................................................70
//ui_baseFrame.h......................................................................................................................................................................................74
//base_frame_graphics_view.hpp............................................................................................................................................................77
1
//base_frame_graphics_view.cpp............................................................................................................................................................ 78
ROS_OpenTLD-tracker .......................................................................................................................................................................................81
//tld_node.cpp.......................................................................................................................................................................................... 81
//main.hpp................................................................................................................................................................................................ 82
//main.cpp .................................................................................................................................................................................................84
ROS_OpenTLD-launch........................................................................................................................................................................................89
//ros_tld_gui.launch ..................................................................................................................................................................................89
//ros_tld_tracker.launch...........................................................................................................................................................................90
ROS_OpenTLD-msg............................................................................................................................................................................................90
//BoundingBox.h....................................................................................................................................................................................... 90
//Target.h.................................................................................................................................................................................................. 94
ROS_OpenTLD-git-opentld/main .......................................................................................................................................................................97
ROS 数据类型 ....................................................................................................................................................................................................98
//std_msgs/Float32...................................................................................................................................................................................98
//std_msgs/Char........................................................................................................................................................................................98
//std_msgs/String......................................................................................................................................................................................98
//std_msgs/Header ................................................................................................................................................................................... 98
//sensor_msgs/Image............................................................................................................................................................................... 98
//sensor_msgs/Image_encodings??......................................................................................................................................................... 99
//sound_play/SoundRequest.................................................................................................................................................................... 99
//geometry_msgs/Twist ............................................................................................................................................................................99
//geometry_msgs/TransformStamped .....................................................................................................................................................99
ROS 系统程序文件..........................................................................................................................................................................................100
//fill_image.h ...........................................................................................................................................................................................100
//cv_bridge.h 系统 ..................................................................................................................................................................................100
//cv_bridge.cpp.......................................................................................................................................................................................105
Linux 系统程序文件........................................................................................................................................................................................105
/usr/include/linux/videodev2.h.............................................................................................................................................................. 105
2
ROS API 介绍
关于 publisher
1.ros::Publisher chatter_pub = n.advertise("chatter", 1000);//创建了一个发布者
2. image_pub_ = it_.advertise("/image_converter/output_video", 1);
3. image_transport::CameraPublisher image_pub_ ;
image_pub_ = it.advertiseCamera("image_raw", 1);
image_pub_.publish((sensor_msgs::Image)img_, (sensor_msgs::CameraInfoPtr)*ci);
关于 advertise 的缓冲区数量, 对于摄像头而言, 缓冲 1 幅图像即可, 试想若缓冲 1000 的话, 当接收图像时接收的是历史图像.
(需要验证???)
但是对于第一行的缓冲区为 1000 的 BaseDemo,listener 还是从最新发布的信息开始读取啊???
关于 subscribe, 订阅者要有一个回调函数, 例如:
image_sub_ = it_.subscribe("/camera/image_raw", 1, &ImageConverter::imageCb, this); //关联了回调函数
// ImageConverter:: 是指该类中的一个函数
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//创建一个订阅者
// chatterCallback 只是外面的与 main 平级的一个函数
代码相关说明: 程序中含有中文注释时, 也能编译成功。 也能运行!
安装的 hydro,只有。h 文件,cpp 文件没有
Demo
//talker.cpp
#include "ros/ros.h"//ROS的头文件
#include "std_msgs/String.h"//ROS自定义的数据类型String所在的头文件
#include //字符串的输入输出流
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");//在名字空间”ros”中的函数init();
//初始化ROS, 是确切说明节点名字的地方, 节点的名字必须唯一, //它允许ROS通过命令行重新命名,
ros::NodeHandle n;//创建了该节点的一个句柄
ros::Publisher chatter_pub = n.advertise("chatter", 1000);//创建了一个发布者
//尖括号里为发布的数据类型, 即消息Message
//圆括号中”chatter”为发布的话题的名称, 即Topic
//这就使得主机告诉了所有订阅了”chatter”话题的节点, 我们将在这个话题上发布数据
//用到了std_msgs, 对应于在创建包时加入 “std_msgs” 一项////////////////////////////
//第二个参数是发布队列的大小, 它的作用是缓冲. 当我们发布消息很快的时候, 它将能缓冲 1000 条信息.
//NodeHandle::advertise()将会返回ros::Publisher对象
//也可以写成ros::Publisher chatter_pub; chatter_pub= n.advertise<...>...
ros::Rate loop_rate(10);//一个ros::Rate对象允许user制定循环的频率
//它将会记录从上次调用Rate::sleep()到现在为止的时间, 并且休眠正确的时间
int count = 0;
while (ros::ok())//默认情况下,roscpp将会安装一个SIGINT监听,它使当Ctrl-C按下时,ros::ok()将会返回 0.
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
3
ROS_INFO("%s", msg.data.c_str());//函数ROS_INFO()将相关数据输出到屏幕上
//输出结果为: hello world 1; hello world 2; hello world 3; ……
chatter_pub.publish(msg);//将该消息, 即字符串 “hello word xxx”, 发布到话题 “chatter”上
ros::spinOnce();//等待消息发布完成
loop_rate.sleep();//休眠一下, 使程序满足前面所设置的 10Hz的要求
++count;
}
return 0;
}
//listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
//该回调函数的输入参数为std_msgs::String msg, 与发布者中的数据类型保持一致/////////////////
//是否可以不用ConstPtr,因为talker中只是String msg的数据结构, 是不用也可以不用 &
//是不是凡是接受者, 都用ConstPtr??
ROS_INFO("I heard: [%s]", msg->data.c_str());//将msg中的信息输出到屏幕上
//输出结果为: I heard: [hello world 1]; I heard: [hello world 2]; I heard: [hello world 3];…
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);//创建一个订阅者
//第一个参数为Topic的名称 “chatter”
//第三个参数为回调函数的名称 //每当在话题上接受到数据, 即调用该回调函数一次
ros::spin();//等到该节点被关闭时,spin()才返回//类似于cvWaitKey()
return 0;
}
//add_two_ints_server.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
{
}
{
}
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
4
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();//程序一直停留在这,等待客户端的请求. 客户端请求一次,就运行一次add()
//等到该节点被关闭时,spin()才返回
return 0;
}
//add_two_int_client.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
ROS_ERROR("Failed to call service add_two_ints");
return 1;
return 0;
}
#CmakeList.txt
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
5
ros::NodeHandle n;//符号::是指名字空间下的一个数据类型
ros::ServiceClient client = n.serviceClient("add_two_ints");
//尖括号里面的, 是指消息的类型.
//Topic话题:圆括号里面的是Topic的名字(节点可以在一个话题上发布消息,同样也可以订阅一个话题来接收消息)
//Message消息: 在一个话题上,发布或订阅时所使用的ROS的数据类型.
beginner_tutorials::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
//request的类型为Request,其下有两个量:a,b
//atoll功能: 把字符串转换成长长整型数
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
}
else
{
}
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
* add a build_depend and a run_depend tag for each package in MSG_DEP_SET
* If MSG_DEP_SET isn't empty the following dependencies might have been
your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
pulled in transitively but can be declared for certainty nonetheless:
* add a build_depend tag for "message_generation"
* add a run_depend tag for "message_runtime"
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##
## * In the file package.xml:
##
##
##
##
##
## * In this file (CMakeLists.txt):
##
##
##
##
##
##
##
##
* add "message_generation" and every package in MSG_DEP_SET to
* uncomment the add_*_files sections below as needed
and list every .msg/.srv/.action file to be processed
find_package(catkin REQUIRED COMPONENTS ...)
* add "message_runtime" and every package in MSG_DEP_SET to
* uncomment the generate_messages entry below
* add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
catkin_package(CATKIN_DEPENDS ...)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Num.msg
## Generate services in the 'srv' folder
add_service_files(
FILES
AddTwoInts.srv
)
)
## Generate actions in the 'action' folder
# add_action_files(
#
#
#
# )
FILES
Action1.action
Action2.action
## Generate added messages and services with any dependencies listed here
6
generate_messages(
DEPENDENCIES
std_msgs
)
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if you package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
CATKIN_DEPENDS message_runtime
#
# LIBRARIES beginner_tutorials
# CATKIN_DEPENDS roscpp rospy std_msgs//
# DEPENDS system_lib
)
INCLUDE_DIRS include
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
${catkin_INCLUDE_DIRS}
)
# add_executable(talker src/talker.cpp)
# target_link_libraries(talker ${catkin_LIBRARIES})
# add_dependencies(talker beginner_tutorials_generate_messages_cpp)
# add_executable(listener src/listener.cpp)
# target_link_libraries(listener ${catkin_LIBRARIES})
# add_dependencies(listener beginner_tutorials_generate_messages_cpp)
add_executable(add_two_ints_server src/add_two_ints_server.cpp)#可执行程序目标
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})#设置单个目标需要链接的库
add_dependencies(add_two_ints_server beginner_tutorials_gencpp) #目标 add_two_ints_server 依赖于 beginner_tutorials_gencpp
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
## Declare a cpp library
# add_library(beginner_tutorials
#
# ) #库目标
src/${PROJECT_NAME}/beginner_tutorials.cpp
## Declare a cpp executable
# add_executable(beginner_tutorials_node src/beginner_tutorials_node.cpp)
7
## Add cmake target dependencies of the executable/library
## as an example, message headers may need to be generated before nodes
# add_dependencies(beginner_tutorials_node beginner_tutorials_generate_messages_cpp)
## Specify libraries to link a library or executable target against
# target_link_libraries(beginner_tutorials_node
#
# )
${catkin_LIBRARIES}
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
#
#
# )
scripts/my_python_script
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
## Mark executables and/or libraries for installation
# install(TARGETS beginner_tutorials beginner_tutorials_node
#
#
#
# )
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#
#
#
# )
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# myfile1
#
#
# myfile2
#
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_beginner_tutorials.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#
# endif()
target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
8