机器人操作系统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 ............................................................................................................................................................................................................. 8
1//RosAria.cpp ........................................................................................................................................................................................... 8 #CmakeList.txt .......................................................................................................................................................................................... 19 2//rosaria_teleop_key.cpp ...................................................................................................................................................................... 19 3//rosaria_teleop_code.cpp .................................................................................................................................................................... 21 #CmakeList.txt .......................................................................................................................................................................................... 22 Images .............................................................................................................................................................................................................. 25
//image_converter.cpp //包 cv_bridge仅有的一个程序 ...................................................................................................................... 25 //hud_gui_simplified.cpp ......................................................................................................................................................................... 26 //usb_cam.h ............................................................................................................................................................................................. 27 //usb_cam.cpp ......................................................................................................................................................................................... 28 //usb_cam_node.cpp ............................................................................................................................................................................... 44 #usb_cam/CmakeList.txt .......................................................................................................................................................................... 47 NiTE, Tf的发布 ................................................................................................................................................................................................ 48
//tf2_ros/transform_broadcaster.h 系统 ............................................................................................................................................... 48 //tf2_ros/transform_broadcaster.cpp系统 ............................................................................................................................................ 48 //tf/transform_broadcaster.h .................................................................................................................................................................. 49 //tf/transform_broadcaster.cpp .............................................................................................................................................................. 50 //tf2_ros/transform_listener.h ................................................................................................................................................................ 50 //tf/transform_listener.h ......................................................................................................................................................................... 51 //openni_tracker.cpp节点 ...................................................................................................................................................................... 54 #CmakeList.txt .......................................................................................................................................................................................... 57 Tf的接收, 并以控制P3AT做示范 ................................................................................................................................................................. 58
//TfListnerAria.cpp ................................................................................................................................................................................... 58 #CmakeList.txt .......................................................................................................................................................................................... 59 语音发布 .......................................................................................................................................................................................................... 60
//sound_play.h ......................................................................................................................................................................................... 60 //SoundDemo.cpp .................................................................................................................................................................................... 62 #CmakeList.txt .......................................................................................................................................................................................... 63 #test/CmakeList.txt .................................................................................................................................................................................. 64 语言接收, 显示/再发声.................................................................................................................................................................................. 64
//VoiceBridgeNode.cpp............................................................................................................................................................................ 64 #CMakeList.txt ......................................................................................................................................................................................... 64 //RespondVoice.cpp ................................................................................................................................................................................. 65 #test/CMakeList.txt .................................................................................................................................................................................. 66 ROS_OpenTLD-GUI ........................................................................................................................................................................................... 66
//tld_gui_node.cpp .................................................................................................................................................................................. 66 //base_frame.hpp .................................................................................................................................................................................... 66 //base_frame.cpp .................................................................................................................................................................................... 68 //ui_baseFrame.h..................................................................................................................................................................................... 72 //base_frame_graphics_view.hpp ........................................................................................................................................................... 75
1
//base_frame_graphics_view.cpp ........................................................................................................................................................... 76 ROS_OpenTLD-tracker ...................................................................................................................................................................................... 79
//tld_node.cpp ......................................................................................................................................................................................... 79 //main.hpp ............................................................................................................................................................................................... 80 //main.cpp ............................................................................................................................................................................................... 82 ROS_OpenTLD-launch ...................................................................................................................................................................................... 87
//ros_tld_gui.launch ................................................................................................................................................................................ 87 //ros_tld_tracker.launch .......................................................................................................................................................................... 87 ROS_OpenTLD-msg ........................................................................................................................................................................................... 88
//BoundingBox.h ...................................................................................................................................................................................... 88 //Target.h ................................................................................................................................................................................................. 91 ROS_OpenTLD-git-opentld/main ...................................................................................................................................................................... 94 ROS数据类型 .................................................................................................................................................................................................. 95
//std_msgs/Float32 .................................................................................................................................................................................. 95 //std_msgs/Char ...................................................................................................................................................................................... 95 //std_msgs/String .................................................................................................................................................................................... 95 //std_msgs/Header .................................................................................................................................................................................. 95 //sensor_msgs/Image .............................................................................................................................................................................. 95 //sensor_msgs/Image_encodings?? ........................................................................................................................................................ 96 //sound_play/SoundRequest ................................................................................................................................................................... 96 //geometry_msgs/Twist ........................................................................................................................................................................... 96 //geometry_msgs/TransformStamped .................................................................................................................................................... 96 ROS系统程序文件 .......................................................................................................................................................................................... 96
//fill_image.h............................................................................................................................................................................................ 96 //cv_bridge.h系统 ................................................................................................................................................................................... 97 //cv_bridge.cpp ...................................................................................................................................................................................... 101 Linux系统程序文件 ...................................................................................................................................................................................... 101
/usr/include/linux/videodev2.h ............................................................................................................................................................. 101
2
ROS API 介绍
关于publisher
1.ros::Publisher chatter_pub = n.advertise
2. image_pub_ = it_.advertise(\, 1); 3. image_transport::CameraPublisher image_pub_ ; image_pub_ = it.advertiseCamera(\, 1);
image_pub_.publish((sensor_msgs::Image)img_, (sensor_msgs::CameraInfoPtr)*ci);
关于advertise的缓冲区数量, 对于摄像头而言, 缓冲1幅图像即可, 试想若缓冲1000的话, 当接收图像时接收的是历史图像. (需要验证???)
但是对于第一行的缓冲区为1000的BaseDemo,listener还是从最新发布的信息开始读取啊???
关于subscribe, 订阅者要有一个回调函数, 例如:
image_sub_ = it_.subscribe(\, 1, &ImageConverter::imageCb, this); //关联了回调函数 // ImageConverter:: 是指该类中的一个函数
ros::Subscriber sub = n.subscribe(\, 1000, chatterCallback);//创建一个订阅者 // chatterCallback只是外面的与main平级的一个函数
代码相关说明: 程序中含有中文注释时, 也能编译成功。 也能运行! 安装的hydro,只有。h文件,cpp文件没有
Demo
//talker.cpp
#include \//ROS的头文件
#include \//ROS自定义的数据类型String所在的头文件 #include
int main(int argc, char **argv) { ros::init(argc, argv, \);//在名字空间”ros”中的函数init(); //初始化ROS, 是确切说明节点名字的地方, 节点的名字必须唯一, //它允许ROS通过命令行重新命名, ros::NodeHandle n;//创建了该节点的一个句柄 ros::Publisher chatter_pub = n.advertise
//这就使得主机告诉了所有订阅了”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 << \ << count; msg.data = ss.str();
3
}
ROS_INFO(\, 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 \
#include \
void chatterCallback(const std_msgs::String::ConstPtr& msg) //该回调函数的输入参数为std_msgs::String msg, 与发布者中的数据类型保持一致/////////////////
//是否可以不用ConstPtr,因为talker中只是String msg的数据结构, 是不用也可以不用 & //是不是凡是接受者, 都用ConstPtr?? { ROS_INFO(\, 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, \); ros::NodeHandle n; ros::Subscriber sub = n.subscribe(\, 1000, chatterCallback);//创建一个订阅者 //第一个参数为Topic的名称 “chatter” //第三个参数为回调函数的名称 //每当在话题上接受到数据, 即调用该回调函数一次 ros::spin();//等到该节点被关闭时,spin()才返回//类似于cvWaitKey() return 0; }
//add_two_ints_server.cpp
#include \
#include \
bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Response &res) { res.sum = req.a + req.b; ROS_INFO(\, (long int)req.a, (long int)req.b); ROS_INFO(\, (long int)res.sum); return true; }
int main(int argc, char **argv) { ros::init(argc, argv, \);
4
}
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService(\, add); ROS_INFO(\);
ros::spin();//程序一直停留在这,等待客户端的请求. 客户端请求一次,就运行一次add() //等到该节点被关闭时,spin()才返回 return 0;
//add_two_int_client.cpp
#include \
#include \ #include
int main(int argc, char **argv) { ros::init(argc, argv, \); if (argc != 3) { ROS_INFO(\); return 1; } ros::NodeHandle n;//符号::是指名字空间下的一个数据类型 ros::ServiceClient client = n.serviceClient
#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
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs
message_generation
5