ROS学习笔记

ROS中的节点名称

首先,rosrun并不是rosrun pkg_name node_name,而是rosrun pkg_name cpp_name
然后,定义的两个name分别是ros::init(argc, argv, ”name1”);
launch文件中的
如果没用使用launch文件,则rqt_graph中的节点名为name1;如果使用了launch文件,则rqt_graph中的节点名为name2

ROS命名空间

https://blog.csdn.net/weixin_45024226/article/details/109811191

Launch中读取的param名

如果直接在launch中写param名,不加任何前缀,如

<launch>
    <node pkg="roadmap" type="roadmap" name="roadmap" output="screen">
        <param name="min_dis" value="12.0"/>
        <param name="neighbor_dis_thr" value="30.0"/>
        <param name="max_iter_k" value="200"/>
        <param name="_lambda" value="0.1"/>
        <param name="_gamma" value="0.9"/>
        <param name="value_iter_esc_thr" value="10.0"/>
        <param name="frontier_dis_thr" value="0.6"/>
    </node>
</launch>

那么ROS参数服务器从这个launch中读取到的param命名为"roadmap/xxx",其中roadmap这个前缀源自type=“roadmap”

话题编程

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 

1000是发布序列的大小。如果发布的消息的频率太高,缓冲区中的消息在大于 1000 个的时候就会开始丢弃先前发布的消息

ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

1000是队列大小,当缓存达到 1000 条消息后,自动舍弃时间戳最早的消息。
如果回调函数在类中,则第三个参数(回调函数)前需要加&,且需要加第四个参数。如果订阅器subscriber在类外被定义,则第四个参数为&类名;如果订阅器subscriber在类内被定义,则第四个参数可使用this。
如,如果sub的定义在类listener外,则应该使用

ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener);

如果sub的定义在类listener内,则可以使用

ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, this);

常用API

ros::Rate loop_rate(10);

/* ros::Rate 对象可以允许你指定自循环的频率。它会追踪记录自上一次调用 Rate::sleep() 后时间的流逝,并休眠直到一个频率周期的时间。在这个例子中,让它以 10Hz 的频率运行,即节点休眠时间为100ms。 */

loop_rate.sleep(); 

//休眠,休眠时间由loop_rate()设定

CmakeList && package.xml

实例化其他包中的类
Package.xml:build_depend,build_export_depend,exec_depend
CmakeList:find_package,target_link_libraries(放在add_executable前面)
加入C++11编译选项
add_compile_options(-std=c++11)

GDB

编译:catkin_make -DCMAKE_BUILD_TYPE=Debug
在launch文件中node标签中加入launch-prefix="xterm -e gdb -ex run --args "
如果使用rosrun,cd you_catkin_workspace/devel/lib/your_package_name,然后gdb nodename,打好断点,输入run

自定义消息类型

一、创建msg消息
1.package.xml

<build_depend>message_generation</build_depend> 	
<run_depend>message_runtime</run_depend>

2.CmakeList
(1)首先调用find_package查找依赖的包,必备的有roscpp rospy message_generation,其他根据具体类型添加,比如上面的msg文件中用到了geometry_msgs/Pose pose类型,那么必须查找geometry_msgs

find_package(catkin REQUIRED COMPONENTS roscpp rospy message_generation std_msgs geometry_msgs)

(2)然后是add_message_files,指定msg文件

add_message_files(
  FILES
  Test.msg
)

(3)然后是generate_messages,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明
#generate_messages必须在catkin_package前面

generate_messages(
 DEPENDENCIES
 geometry_msgs
)

(4)然后是catkin_package设置运行依赖

catkin_package(

CATKIN_DEPENDS message_runtime

)

二、msg使用
1.在本包内使用 直接在cpp文件中include .h文件即可
2.在其他包中使用 A包引用B包的msg文件
(1)package.xml

 <build_depend>B_package</build_depend>
<build_export_depend>B_package</build_export_depend>
 <exec_depend>B_package</exec_depend>

(2)CMakeList
在find_package部分加入B包
将以下代码取消注释

include_directories(
  include
 ${catkin_INCLUDE_DIRS}
)

消息使用

未知大小数组消息类型赋值
如nav_msg/Path
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/PoseStamped[] poses
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
想要给这种类型的消息MainMsg赋值,需要定义一个geometry_msgs/PoseStamped类型的变量TmpMsg,然后循环将值赋给变量TmpMsg,再MainMsg.push_back(TmpMsg)

优先级队列

std::priority_queue
基本操作
• top 访问队头元素
• empty 队列是否为空
• size 返回队列内元素个数
• push 插入元素到队尾 (并排序)
• emplace 原地构造一个元素并插入队列
• pop 弹出队头元素
• swap 交换内容

PCL

PointXYZ
访问PointXYZ的两种方式
//访问xyz方式一
float x = cloud.points[i].data[0];
float y = cloud.points[i].data[1];
float z = cloud.points[i].data[2];
//访问xyz方式二
float x = cloud.points[i].x;
float y = cloud.points[i].y;
float z = cloud.points[i].z;

CMakeList

记得把

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)

取消注释

ROS引用其他功能包的头文件

主要参考该教程
在写include的时候注意需要这么写:假设需要在A包中引用B包中include文件夹中C/D.h,要直接写include C/D.h,而不是include B/C/D.h

你可能感兴趣的:(自动驾驶)