文章目录
- 1. 提取bag中固定topic或者固定时间段数据
- 2. 提取pcd数据
- 3. 记录数据
- 4. service & action
- 5. roslaunch文件
- 6. 自定义消息
- 7. from raw velodyne_packets to velodyne_points
- 8. rqt_bag查看数据
- 9. 引用另一包内库文件(devel/lib/libXXX.so)
- 10. escalating to SIGTERM
- 11. conflicting declaration ‘typedef struct LZ4_stream_t LZ4_stream_t’解决
- 12. 查看数据frame
- 13. ros中的时间
- 14. 播放rosbag使用-k参数,节点才会继续运行
- 15. rosbag play -s [Sec]
1. 提取bag中固定topic或者固定时间段数据
rosbag filter my.bag out.bag "topic == '/tf' or topic == '/tf2'"
rosbag filter my.bag out.bag "t.to_sec() >= 123444.77 and t.to_sec() <= 234545.88"
2. 提取pcd数据
rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory>
// save pointcloud2 to current diectory
rosrun pcl_ros pointcloud_to_pcd input:=/topic_name
3. 记录数据
rosbag record /topic_name1 /topic_name2 /topic_name3
rosbag record -O filename.bag /topic_name1
4. service & action
ROS中的topic为同步通讯,service为异步通讯机制,service在要求异步而且响应时间不定的场景下有先天的劣势,如果服务端迟迟没有响应,那么客户端程序将处于阻塞状态,直到超时,这会使操作变得相当耗时。
action实现了一种类似于service的请求/响应通讯机制,区别在于action带有反馈机制,用来不断向客户端反馈任务的进度,并且还支持在任务中途中止运行。 客户端给服务端抛出一个目标,然后客户端就可以去干别的事情了,在任务执行期间,客户端会以消息的形式,周期性地接收到来自服务端的进度反馈,如果没有终止任务的话这个过程会一直延续到收到最终的结果。当然也可以随时终止当前的操作,开始一个全新的操作。
5. roslaunch文件
<arg name="projfolder" default="/home/joe/workspace/testData/playground"/>
<param name="projpath" type="string" value="$(arg projfolder)/"/>
<node pkg="rosbag" type="play" name="player" output="screen" args="--clock $(arg projfolder)/20190311playgroundloopcut.bag --topics /velodyne_points" />
6. 自定义消息
//1 add message/service file
add_message_files(DIRECTORY msg FILES test.msg)
add_service_files(DIRECTORY srv FILES test.srv)
//2 add dependencies 在devel/include中生成.h头文件
generate_messages(DEPENDENCIES std_msgs geometry_msgs)
//3 add depends
catkin_package(INCLUDE_DIRS .../*头文件*/
CATKIN_DEPENDS message_generation message_runtime .../*ros依赖包*/
DEPENDS .../*非ros依赖包*/) //需要message_generation生成C++或Python能使用的代码,需要message_runtime提供运行时的支持
···
include_directories(... )
link_directories(... )
···
add_executable()
target_link_libraries()
// a)
add_dependencies(test ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp) // 编译消息
// b)
// find_packages(catkin REQUIRED COMPONENTS test_msgs)
add_dependencies(test ${catkin_EXPORTED_TARGETS}/**/ test_msgs_gencpp) // 使用自定义消息, 调用同一工作空间的自定义消息类型时注明依赖关系,防止发生头文件找不到的报错
7. from raw velodyne_packets to velodyne_points
rosbag play XX.bag /raw/data_packets:=/velodyne_packets // remap topic name
rosrun velodyne_pointcloud cloud_node _calibration:=calibration.yaml
7.1 from *.pcap file to rosbag
# 读取PCAP文件
rosrun velodyne_driver velodyne_node _model:=VLP16 _pcap:=/your/pcap/path/data.pcap _read_once:=true
# 转换
rosrun velodyne_pointcloud cloud_node _calibration:=calibration.yaml
# 录包
rosbag record -O file.bag /velodyne_points
8. rqt_bag查看数据
rqt_bag sample.bag
https://blog.csdn.net/orange_littlegirl/article/details/99304550
9. 引用另一包内库文件(devel/lib/libXXX.so)
// 在CMakeLists中添加
find_package(catkin REQUIRED COMPONENTS XXX )
// install库文件到ros空间下
install(
TARGETS
XXX
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
)
// install headers
install(DIRECTORY include/pclomp
DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION})
# 在package.xml文件中添加依赖
<build_depend>XXX</build_depend>
<run_depend>XXX</run_depend>
10. escalating to SIGTERM
运行ros节点执行ctrl+c后进程会转而执行rosspin()后面的程序,但是如果在一定时间内程序没有执行完毕,进程会强制退出,并抛出“escalating to
SIGTERM”错误,为了解决此问题,可以修改/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch路径下的nodeprocess.py文件,将该文件第48行的“_TIMEOUT_SIGINT
= 15.0 #seconds”中的15秒改为您期望运行的最大时间。
11. conflicting declaration ‘typedef struct LZ4_stream_t LZ4_stream_t’解决
sudo mv /usr/include/flann/ext/lz4.h /usr/include/flann/ext/lz4.h.bak
sudo mv /usr/include/flann/ext/lz4hc.h /usr/include/flann/ext/lz4.h.bak
sudo ln -s /usr/include/lz4.h /usr/include/flann/ext/lz4.h
sudo ln -s /usr/include/lz4hc.h /usr/include/flann/ext/lz4hc.h
12. 查看数据frame
rostopic echo /topic | grep frame_id
13. ros中的时间
播放rosbag时,若参数/use_sim_time 为true,则此时
- ros::WallTime::now()为当前的真实时间,也就是墙上的挂钟时间,一直在走。
- ros::Time::now()为rosbag当时的时间,是由bag中/clock获取的。是仿真时间。使用模拟时间时,当 /clock节点接受到第一条消息时,now() 返回时刻 0,此时客户端还不知道时钟时间。
# 检测到时钟错误
find . -type f -exec touch {} /;
find . -type f -print | xargs touch
14. 播放rosbag使用-k参数,节点才会继续运行
15. rosbag play -s [Sec]
使包从据开始时间【Sec】处开始运行