ROS 使用笔记

发布时间:2026/9/9 20:43:52

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/9/9 6:12:46

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

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

2026/9/5 14:55:35

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

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

2026/9/6 8:09:06

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

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

2026/9/9 20:40:24

物流大数据分析平台全解析:从Hadoop到机器学习预测的完整实践

每年毕业季都会被同一个问题轰炸:“大数据方向毕设到底选什么题?”我的答案一直是——做一个物流大数据分析平台。不是因为物流概念火,而是这个题目能把Hadoop、Spark、Hive、机器学习、深度学习一整条大数据技术链全部串起来,既有…

2026/9/9 20:40:24

参数化螺旋建模工具Helix 3D Toolkit:高效生成弹簧与螺纹

简介:面向WPF与WinRT/Metro开发者的Helix 3D Toolkit工具包,用于在Windows应用中快速集成三维交互场景。借助视图控件和模型容器,可轻松实现模型展示、旋转、缩放、平移以及灯光材质效果;内置源码与大量示例,适合中高级…

2026/9/9 20:40:24

Rust never类型稳定:从发散函数到Result<T, !>的完整解析

很多 Rust 开发者在第一次写match时,都会发现一个“违反直觉”的现象:某个分支里随手写一个panic!("unexpected"),编译器居然不报错,还把整个match表达式当成正常的i32返回。这不是编译器开了后门,而是因为这…

2026/9/9 20:40:24

Rust never 类型全解析:从发散函数到类型系统一等公民

最近社区里关于 never 类型的讨论热度明显上升,Lets Get Rusty 也专门用一期内容梳理了!类型即将获得更完整支持的进展。很多 Rust 开发者在初次看到fn foo() -> !这个签名时,都会觉得语法很神秘,其实我们几乎每天都在和 never 类型打交道…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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