1 路径搜索
终端使用
rospkg find package name : return the absolute path to a package
rospack list | grep 'package_name'
python 使用
import rospkg
rospack = rospkg.RosPack()
dir = rospack.get_path("package name")
2从bag中解析数据
过滤数据:
rosbag filter
或
rosbag play + rosbag record(可以同时record多个bag)
终端直接输出
rosbag info xxx.bag
rosbag play xxx.bag
rostopic echo '/xx_topic'
python 使用
import collections
import rosbag
def read_pose_from_ros_bag(ros_bag_file, topics=None):
'''
Reads different kinds of topics from a ros bag file.
Returns a dict with key as topic name, value as content array
topic1 :[data1, data2...]
topic2 :[data3, data4...]
'''
bag = rosbag.Bag(ros_bag_file)
out = collections.defaultdict(list)
if topics is None:
topics = []
for topic, msg, _ in bag.read_messages(topics=topics, raw=True):
out[topic.split('/')[-1]].append(msg)
bag.close()
return out
3 __name, 同一个ros系统中不能同时跑多个相同名字的node, 如果想跑, 可以利用__name映射为其他名字.
使用方法 rosrun pkg_name node_name __name:=new_name
比如rosrun lidar_calibration lidar_calib __name:=lidar_calib2
4play bag
rosbag play *.bag -r 0.2 同时play多尔bag 并慢放.
rosbag play xx.bag -l 循环播放bag
5 roslaunch 自带启动roscore的功能
roscore 和 roslaunch启动先后顺序有什么不同?
一个空的环境, 无论谁先启动都会挂着不退出.如果先启动roscore, roslaunch中启动roscore的部分会跳过,但其他内容会执行.
如果先启动roslaunch, roscore会启动不成功,提示系统已经有一个rosmaster了.
6 rosrun 不依赖于roscore, 但会依赖于ros source的环境.
rosrun [package] [executable]
在一个ros package下, 利用rosrun可以定位到包内任意可执行文件,比如devel下面编译生成的binary, 源文件包内的 python scripts。
在一个binary里加入ros::init(argc, argv, "123"); ros::NodeHandle nh;
就代表此binary是ros node.
这个时候再跑此binary就必须依赖roscore.因此在binary中,如果不需要和参数服务器打交道,不发布和接收rostopic,就不要使binary中成为一个ros node。