ROS 使用笔记

发布时间:2026/11/5 15:11:35

ROS 使用笔记 1.什么是 ROSROS (Robot Operating System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务包括硬件抽象底层设备控制常用函数的实现进程间消息传递包管理用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数2. 为什么使用ROSROS 的主要目标是为机器人研究和开发提供代码复用的支持。简单来说就是避免重复造轮子。为什么ROS可以提高代码复用率因为ROS有程序包和功能包概念类比与C或Python的库的概念这些包易于被分享和发布而且ROS也支持一种类似于代码储存库的联合系统这个系统也可以实现工程的协作及发布。这个设计可以使一个工程的开发和实现完全模块化同时所有的工程都可以被ROS的基础工具整合在一起。除此之外ROS还有以下优势精简ROS被设计为尽可能精简易于与其他机器人软件框架集成语言独立性为了支持更多应用开发和移植ROS设计为一种语言弱相关的框架结构中立的定义语言描述模块间的消息接口Java、C、Python都可以进行ROS开发。大型应用ROS适用于大型运行时系统和大型开发流程丰富的组件化工具包ROS可采用组件化方式集成一些工具和软件到系统中并作为一个组件直接使用如RVIZ、Gazebo等后面都会介绍。免费且开源开发者众多功能包多3. 创建ROS工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace4. 头文件#include ros/ros.h #include nav_msgs/Odometry.h #include sensor_msgs/Imu.h #include sensor_msgs/NavSatFix.h #include sensor_msgs/PointCloud2.h #include std_msgs/Float32.h #include cv_bridge/cv_bridge.h5. 类定义class Scheduler { public: Scheduler(ros::NodeHandle node_handle); ~Scheduler(); void initialize(); void run(); private: void imuHandler(const sensor_msgs::Imu::ConstPtr msg); void gpsHandler(const sensor_msgs::NavSatFix::ConstPtr msg); void cloudHandler(const sensor_msgs::PointCloud2ConstPtr msg); void imageHandler(const sensor_msgs::Image::ConstPtr msg); void compressedImageHandler(const sensor_msgs::CompressedImage::ConstPtr msg); private: ros::NodeHandle node_handle_; // Subscriber ros::Subscriber imu_sub_; ros::Subscriber gnss_sub_; ros::Subscriber cloud_sub_; ros::Subscriber image_sub_; ros::Subscriber compressed_image_sub_; // Publisher ros::Publisher location_pub_; };6. 初始化void Scheduler::initialize() { imu_sub_ node_handle_.subscribe(imu_topic, 10, Scheduler::imuHandler, this, ros::TransportHints().tcpNoDelay()); gnss_sub_ node_handle_.subscribe(gps_topic, 2, Scheduler::gpsHandler, this); cloud_sub_ node_handle_.subscribesensor_msgs::PointCloud2(lidar_topic, 1, Scheduler::cloudHandler, this); image_sub_ node_handle_.subscribe(camera_topic, 5, Scheduler::imageHandler, this); compressed_image_sub_ node_handle_.subscribe(camera_topic, 5, Scheduler::compressedImageHandler, this); location_pub_ n.advertisestd_msgs::String(topic_m,1000); }7. 回调函数void Scheduler::imuHandler(const sensor_msgs::Imu::ConstPtr msg) { time msg-header.stamp.toSec(); // acceleration Eigen::Vector3d acceleration(msg-linear_acceleration.x, msg-linear_acceleration.y, msg-linear_acceleration.z); // angular velocity Eigen::Vector3d angular_velocity(msg-angular_velocity.x, msg-angular_velocity.y, msg-angular_velocity.z); } void Scheduler::gpsHandler(const sensor_msgs::NavSatFix::ConstPtr msg) { Eigen::Vector3d position(msg-longitude, msg-latitude, msg-altitude); } void Scheduler::cloudHandler(const sensor_msgs::PointCloud2ConstPtr msg) { pcl::PointCloudpcl::PointXYZI::Ptr cloud; pcl::fromROSMsg(*msg, *cloud); } void Scheduler::imageHandler(const sensor_msgs::ImageConstPtr msg) { double time_nsecond msg-header.stamp.toNSec(); cv::Mat color_image; cv_bridge::CvImageConstPtr srcImage cv_bridge::toCvShare(msg, sensor_msgs::image_encodings::RGB8); }8. 服务器bool add(beginner_tutorials::AddTwoInts::Request req, beginner_tutorials::AddTwoInts::Response res) { res.sum req.a req.b; ROS_INFO(request: x%ld, y%ld, (long int)req.a, (long int)req.b); ROS_INFO(sending back response: [%ld], (long int)res.sum); return true; } ros::ServiceServer service n.advertiseService(add_two_ints, add);9. 客户端ros::NodeHandle n; ros::ServiceClient client n.serviceClientbeginner_tutorials::AddTwoInts(add_two_ints); beginner_tutorials::AddTwoInts srv; srv.request.a atoll(argv[1]); srv.request.b atoll(argv[2]); if (client.call(srv)) { ROS_INFO(Sum: %ld, (long int)srv.response.sum); } else { ROS_ERROR(Failed to call service add_two_ints); return 1; }10. 参数服务器参数服务器一般用两个函数getParam和paramgetParam就是获取参数std::string parameter; node_handle_.getParamstd::string(param, parameter);param使用时比较容易出错因为它有两种使用方式// 设置参数 node_handle_.paramstd::string(param, parameter); // 获取参数 node_handle_.paramstd::string(param, parameter, parameters.xml);11. 主函数int main(int argc, char **argv) { ros::init(argc, argv, node); ros::NodeHandle node_handle(~); ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info); double time ros::Time::now().toSec() // 获取系统时间 Scheduler scheduler(node_handle); scheduler.initialize(); scheduler.run(); return 0; }12. 读包rosbag::Bag bag; bag.open(bag_path, rosbag::bagmode::Read); //打开一个bag文件 rosbag::View view(bag); for (rosbag::View::iterator it view.begin(); it ! view.end(); it) { std::string topic it-getTopic(); if (topic raw_canbus_driver_topic_) { std_msgs::String::ConstPtr msg it-instantiatestd_msgs::String(); ProcessRawChassis(msg); } else { // do something } }13. 写包rosbag::Bag bag_file(output_file_path.string(),rosbag::bagmode::Write); ros::Duration duration(1.0 / 50); ros::Time time_stamp ros::Time::now(); for (const WheelOdom wheel_odom_msg : wheel_odom_carrier) { localization_msg::Proto msg; if (wheel_odom_msg.SerializeToString((msg.buf))) { msg.header.stamp time_stamp; bag_file.write(config.wheel_odom_config.wheel_odom_topic, time_stamp, msg); } time_stamp duration; }参考文献rosbag record录包ROS入门学习笔记五_文科升的博客-CSDN博客_ros 录包ROS的学习十六用C写一个简单的服务器(service)和客户端(client)_BigHerbert的博客-CSDN博客ROS services ros::advertiseService和ros::serviceClient的简单demo_jack_20的博客-CSDN博客_advertiseservicerostopic 只echo部分信息_泠山的博客-CSDN博客ROS从入门到精通(一) ROS简介、安装与常见问题 - 知乎
延伸阅读

更多相关文章

2026/10/31 0:06:20

STM32F101ZG与CMT-8540S-SMT音频系统设计与优化

1. STM32F101ZG与CMT-8540S-SMT的硬件协同设计1.1 微控制器选型考量STM32F101ZG作为STMicroelectronics的Cortex-M3内核MCU,其144引脚封装和1024KB闪存容量为音频处理提供了充足资源。在实际项目中,我特别看重它的以下特性:72MHz主频&#xf…

2026/11/4 8:04:01

CIMPro视频融合宽高比调整:解决画面拉伸变形的实战指南

在数字孪生项目开发中,视频融合是连接现实世界与虚拟空间的关键技术环节。很多开发者在CIMPro平台上进行视频融合时,经常会遇到画面拉伸变形、黑边显示不全或比例失调等问题,这些问题的核心往往源于宽高比配置不当。本文将系统讲解CIMPro视频…

2026/11/3 1:26:49

基于事件驱动架构的Java外卖霸王餐试吃流程状态变更通知系统设计

基于事件驱动架构的Java外卖霸王餐试吃流程状态变更通知系统设计 在外卖霸王餐试吃活动中,订单状态(如“已报名”、“审核中”、“已中选”、“待评价”)的变更需要实时通知用户、运营后台、积分系统等多个下游模块。若采用传统的同步调用&am…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑