核心概念(4点):
主节点(Master):
roscore
节点(Node):
运行节点:rosrun package_name node_name
查看激活节点列表:rosnode list
列出节点信息:rosnode info node_name
节点崩溃,清除节点注册信息:rosnode cleanup
话题(Topic):
查看激活话题:rostopic list -v
显示topic实时内容:rostopic echo /topic_name
显示话题信息:rostopic info /topic_name
显示topic发布频率(查看传感器数据发布频率):rostopic hz /topic_name
消息(Message):
定义话题(topic)类型的数据结构(整型、浮点型、布尔型、字符串),格式*.msg
查看话题的消息类型:rostopic type /topic_name
深入查看message信息:rosmsg info message_type
列出所有message:rosmsg list
显示message内字段定义:rosmsg show message_name
例:rosmsg show sensor_msgs/LaserScan
qt构建系统:
https://www.pianshen.com/article/9444937581/
写节点:
发布者节点:
1.初始化 ROS 系统
2.创建NodeHandle
3.用NodeHandle广播将要在 chatter 话题上发布 std_msgs/String 类型的消息
4.设置发布频率
5.进入循环,定义并发布msg
订阅者节点:
1.定义回调函数
2.初始化ROS系统,
同时可以指定节点名称ros::init(argc,argv,"save_cloud");
3.创建NodeHandle
4.用NodeHandle订阅 chatter 话题,当消息到达,调用 chatterCallback() 函数
5.进入自循环,等待消息的到达
CMakeList.txt:
添加可执行代码add_executable(lesson1_laser_scan_node src/laser_scan_node.cpp)
可执行文件名称:lesson1_laser_scan_node
源代码路径:src/laser_scan_node.cpp
目标链接库:target_link_libraries(lesson1_laser_scan_node ${catkin_LIBRARIES)
可执行文件名称:lesson1_laser_scan_node
ROS_INFO_STREAM打印绿色
ROS_INFO_STREAM("\033[1;32m----> Feature Extraction Started.\033[0m");
----> Feature Extraction Started.变为绿色
记得改完源代码后编译
ROS坐标系
map: 地图坐标系,世界坐标系,静止不动
odom: 里程计坐标系,相对于map来说,一般情况下静止。有时会变动(定位节点为了修正机器人的位姿从而改变了map->odom间的坐标变换)
base_link: 机器人旋转中心的坐标系,相对于odom来说base_link是运动的
laser_link: 激光雷达的坐标系,相对于base_link来说是静止的
map -> odom -> base_link -> laser_link TF树
可用rqt或rviz可视化
ROS用TF2作为管理坐标系的库,教程:http://wiki.ros.org/tf2/Tutorials
https://blog.youkuaiyun.com/tiancailx/article/details/111312853#t1
参数服务器
nh.param("image_topic", image_topic_, std::string("/sensor/image"));
第 1 个参数image_topic: 如果在launch文件里有值,则赋给第 2 个参数
第 3 个参数: 默认值, 第 1 个参数无值时起作用
使用bag包时间
launch文件中加入:
<param name="/use_sim_time" value="true" />
播包时:
rosbag play --clock xx.bag
bag包加速
rosbag play --clock -r 2 *.bagh