news 2026/9/16 1:18:02

ROS/C++ 入门(Introduction to ROS/C++)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS/C++ 入门(Introduction to ROS/C++)

原文:https://syrotek.ciirc.cvut.cz/course/ROS_CPP_INTRO

当我看到这一个教程的时候很兴奋,因为这里面的东西很实在,干货比较多。这个系列的教程有基于stage的仿真,有实物对照还是不错的。所有的翻译不一定完全遵照原文,掺杂有翻译者的个人经验和理解

主要内容:

1. ROS的入门介绍

2.基于激光雷达的避障

3.沿墙运动

4.PID控制器

5.里程计的矫正

6.固定路径跟随

1、ROS 入门介绍

ROS (Robot Operating System)

ROS是一个编写机器人软件很灵活的框架,它包含了工具集、库和协议(conventions),这些包通过交叉不同的机器人平台,可以简化机器人的开发。
ROS支持多中操作系统,但是官方支持的是ubuntu,每一个版本ubuntu对应一个ROS版本,ROS indigo 版本对应的是ubuntu 14.04,kinetic对应ubuntu 16.04,本教程采用的是ros kinetic版本。
在ros下运行的可以理解为图节点,通过ROS的通信框架这些线程被松散耦合到一起。编写ROS时候采用ROS的客户端库,ROS允许用不同程序编写的节点进行通讯。节点既可以通过topic进行subscribe/publish,也可以服务(service)的方式进行通讯。ROS只有一个MASTER节点,它提供的是名称检索服务,帮助节点之间建立通讯。roscore的启动命令:
roscore
节点启动命令;
rosrun <package_name> <executable_name> <parameters>
如果有多个节点要启动可以编写launch文件,通过roslaunch命令启动。

创建包(packages)

编写ROS程序时候需要首先创建一个package1,首先跳转到路径catkin_ws/src下面。执行下面的指令,
catkin_create_pkg <package_name> [dep1] ... [depN]
将package_name替换为自己的package名字,dep1 。。。 depN为依赖包,本教程中常用依赖项为:roscpp、std_msgs。编写C++时候依赖包要包含roscpp,python程序需要rospy,用其他语言编写ROS程序不推荐,因为支持的不是特别好。
添加依赖roscpp后,生成的包里面会在目录下面生成两个新文件(package.xml, CMakeLists.txt)和两个新目录(src/, include/),你可以在package.xml填写这个package的相关信息(作者,版本,名字、描述、、、) 。头文件一般放在include目录下面,源文件放在src目录下面。

准备 CMakeLists.txt

可以设置变量来包含所有必要的源文件:
set (SRCS1 ${SRCS1} src/file_1.cpp)
set (SRCS1 ${SRCS1} src/file_2.cpp)
包含catkin文件路径:
include_directories(include ${catkin_INCLUDE_DIRS})
创建可执行文件和catkin库:
add_executable(executable_name ${SRCS1})## executable_name 节点的名字
target_link_libraries(executable_name ${catkin_LIBRARIES})

编译程序

跳转到catkin_ws目录下面,执行下面的指令:
catkin_make

ROS and C++

如果是用C++编写的ROS程序,必须添加roscpp依赖,ros.h里面有常用的ros代码
#include "ros/ros.h"
ros程序正常运行必须得初始化
ros::init(argc, argv, "name_of_the_node");
初始化完成后需要一个Nodehandle进行ros的资源管理、通信
ros::NodeHandle n;

Messages 和 topics

如上面提到的分立的节点之间是通过topic进行通讯的。每一个节点既可以publish 消息到topic上面,也可以通过subscribe的方式获得topic上的信息。ROS里面包含了很多种类的messages,也可以自己创建。基本的消息类型包含在std_msgs包里面。大多数的消息里面会包含:std_msgs::Header。你可以看到这个message的详尽内容如下操作:
rosmsg show Header
输出结果:
uint32 seq time stamp string frame_id
Header里面包含了三个变量,seq序列号,保证发送的多个消息可以正确的排列,stamp是epoch格式的时间戳。frame_id为坐标系名字,header的名字可以通过std_msgs::Header类在C++中访问。
为了能够发布消息,必须创建一个publisher对象:
ros::Publisher pub = n.advertise<std_msgs::Header>("topic_name", 1000);
1000为缓冲区的大小,通过pub函数进行发送消息:
pub.publish(message);
定于一个主题的时候需要创建一个callback函数,接收和处理订阅的topic的消息。
void callback(const std_msgs::Header::ConstPtr& msg);
创建一个subscriber,在消息publish到topic上时候会调用这个callback函数。
ros::Subscriber sub = n.subscribe("topic_name", 1000, callback);
也可以把callback函数写作类里面:
ros::Subscriber sub = n.subscribe("topic_name", 1000, &SomeClass::callback, instanceOfThatClass);
最后调用spin,开始subscribe消息:
ros::spin();

ROS常用调试图形化工具

rqt

rviz

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUrcvdY2-1593495897541)(https://img-blog.csdn.net/20171119164111634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd190b20=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

机器人stage 仿真

下载仿真机器和环境:(右键另存为)
eci-arena.world
运行指令启动仿真环境:
rosrun stage_ros stageros <path_to_the_world_file>/eci-arena.world

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 1:17:09

VsCode配置C/C++开发环境:从MinGW-w64安装到调试全攻略

1. 为什么我劝新手直接选VsCode而不是Visual Studio很多刚接触编程的朋友总在纠结一个问题&#xff1a;学C/C到底该用什么工具&#xff1f;有人推荐Visual Studio&#xff0c;有人推荐Code::Blocks&#xff0c;还有人推荐Dev-C。我的建议很直接&#xff0c;如果你不是专门做Win…

作者头像 李华
网站建设 2026/9/16 1:17:01

SpringBoot校园新闻平台开发与部署实战

1. 项目背景与核心价值校园新闻发布平台是高校信息化建设中不可或缺的一环。传统校园新闻发布往往面临几个痛点&#xff1a;内容更新滞后、多终端适配困难、审核流程繁琐、数据统计缺失。基于SpringBoot的解决方案恰好能系统性解决这些问题。我在实际开发中发现&#xff0c;Spr…

作者头像 李华
网站建设 2026/9/16 1:16:52

STM32F103串口通信实战:标准库UART配置与调试全解析

简介&#xff1a;面向嵌入式初学者与STM32开发者&#xff0c;这套实验工程以STM32F103C8T6为核心&#xff0c;基于标准外设库演示UART串口通信的完整实现流程。工程通过串口输入1、2、3任意数字&#xff0c;分别输出不同内容&#xff0c;可直观观察字符接收、分支判断与回显发送…

作者头像 李华
网站建设 2026/9/16 1:15:58

MNE脑电数据预处理完整流程:从读取到保存的实战指南

写这份学习笔记之前&#xff0c;我翻了翻之前跑过的分析流程&#xff0c;发现真正卡住新手的往往不是某个算法不好懂&#xff0c;而是“读数据之后不知道下一步该干嘛”。MNE这个库本身功能很全&#xff0c;但全也意味着容易迷路&#xff1a;是先滤波还是先剪裁&#xff1f;用c…

作者头像 李华
网站建设 2026/9/16 1:15:41

OpenClaw 跑 Sub-agent 编排:Key 走 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华