十一前就仔细看了下ros_tutorials源码,下面是ROS初学者练习时会涉及的小乌龟包的源码个人详解,供参考。
源码github库 子目录turtlesim:https://github.com/ros/ros_tutorials
附有个人注释github链接:https://github.com/yyFFans/CommentedRosTurtlesim.git
百度网盘链接:https://pan.baidu.com/s/1QwZHMUtN6XvNvbr7q6NYIA
提取码:nehv
1. 小乌龟界面绘制原理 整体函数调用过程
QT应用中周期性检测界面是否有触发变化,根据变化,重新绘制
变化触发由ROS topic/Service 机制提供,见后面说明
- TurtleApp (QApplication)
- TurtleFrame (QFrame) 容纳M_Turtle
- onUpdate 周期性检查是否有turtle发生位姿变化,有就重新绘制
- updateTurtles
- Turtle::update 检查是否有变化,更新位姿
- update 重新绘制 (QT机制update 调用paintEvent绘制界面)
- paintEvent
- Turtle::paint
- paintEvent
- updateTurtles
- onUpdate 周期性检查是否有turtle发生位姿变化,有就重新绘制
- TurtleFrame (QFrame) 容纳M_Turtle
2. 目录结构及说明
- images 小乌龟图片目录
- msg ROS topics 消息格式定义
- srv ROS Service 格式定义
- launch roslaunch 方式启动文件,可以自定义,也可以通过命令行rosrun来启动相应程序
- include turtlesim包自定义的相关头文件
- src turtlesim包源文件
- tutorials 一些使用turtlesim的教程用例源文件
- package.xml 包构建和运行时相关依赖描述
-
CMakeLists.txt 包编译相关描述文件
3. 代码阅读顺序参考说明
入口main 以及 exec
创建一个QT应用,加载TurtleFrame实例

TurtleFrame构造函数
TurtleFrame实例初始化,背景图片path_image_、背景图画笔path_painter_、界面更新定时器update_timer_、加载所有小乌龟图片保存在 turtle_images_turtle_images_、服务注册clear(界面清理,只删除轨迹)/reset(界面重置,回到初始加载状态)/spawn(生成一只新的小乌龟)/kill(删除指定名称小乌龟)、spawnTurtle初始加载时在中心位置生成一只小乌龟

spawnTurtle函数
创建小乌龟Turtle实例,并将名称和实例保存在字典turtles_中


Turtle构造函数
小乌龟图片turtle_image_,小乌龟图片中心位置pos_,小乌龟图片方向orient_,位姿变化之位移量lin_vel_,位姿变化之旋转量ang_vel_;
关键点订阅了cmd_vel话题,该话题在teleop_turtle_key中发布,用于控制小乌龟位姿变化

TurtleFrame周期更新函数
周期定时器update_timer_超时信号与槽onUpdate绑定,即周期性调用onUpdate函数;onUpdate函数通过ros::spinOnce()做一次检查ROS 通讯机制(topic/service)中是否存在缓存队列,调用相应回调函数进行处理,更新小乌龟信息;updateTurtles函数中检查是否有小乌龟出现变化,轨迹绘制,和窗口刷新(小乌龟位姿变化更新)



paintEvent函数
QT机制,QT绘制部件实例调用update函数即调用相应paintEvent函数。此时小乌龟的位姿信息已经在updateTurtles中调用小乌龟的uodate函数中得到更新,小乌龟的paint函数根据更新后的位姿信息绘制小乌龟

网友评论