ros笔记

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。

你可能感兴趣的:(ROS)