博客
关于我
ROS使用笔记
阅读量:249 次
发布时间:2019-03-01

本文共 4108 字,大约阅读时间需要 13 分钟。

创建ROS工作空间及相关开发指南

1. 创建ROS工作空间

在ROS中创建一个工作空间的步骤如下:

mkdir -p ~/catkin_ws/srccd ~/catkin_ws/srccatkin_init_workspace

2. 头文件引用

在ROS项目中,头文件的引入通常包含以下内容:

#include 
#include
#include
#include
#include
#include
#include

3. 类定义

以下是对Scheduler类的定义:

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::ImageConstPtr& msg);    void compressedImageHandler(const sensor_msgs::CompressedImage::ConstPtr& msg);private:    ros::NodeHandle node_handle_;    ros::Subscriber imu_sub_;    ros::Subscriber gnss_sub_;    ros::Subscriber cloud_sub_;    ros::Subscriber image_sub_;    ros::Subscriber compressed_image_sub_;    ros::Publisher location_pub_;};

4. 初始化

Scheduler类的初始化方法如下:

void Scheduler::initialize() {    // IMU主题订阅    imu_sub_ = node_handle_.subscribe("imu_topic", 10, &Scheduler::imuHandler, this, ros::TransportHints().tcpNoDelay());    // GPS主题订阅    gnss_sub_ = node_handle_.subscribe("gps_topic", 2, &Scheduler::gpsHandler, this);    // LiDAR主题订阅    cloud_sub_ = node_handle_.subscribe("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_ = node_handle_.advertise
("topic_m", 1000);}

5. 回调函数

以下是各个回调函数的实现:

void Scheduler::imuHandler(const sensor_msgs::Imu::ConstPtr& msg) {    time = msg->header.stamp.toSec();    // 加速度和角速度处理    Eigen::Vector3d acceleration(msg->linear_acceleration.x,                                  msg->linear_acceleration.y,                                  msg->linear_acceleration.z);    // 角速度处理    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::PointCloud
::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);}

6. 服务器实现

以下是服务端的实现:

bool add(const beginner_tutorials::AddTwoInts::Request& req,          const 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);

7. 客户端实现

以下是客户端的实现:

ros::NodeHandle n;ros::ServiceClient client = n.serviceClient
();

8. 参数服务器

参数服务器的使用方法:

// 获取参数std::string parameter;node_handle_.getParam("param", parameter);// 设置参数node_handle_.param["param"] = parameter;// 获取参数(可选参数服务器配置)node_handle_.param["param"] = parameter;node_handle_.param["param"] = parameter;

9. 主函数

以下是主函数的实现:

int main(int argc, char** argv) {    ros::init(argc, argv, "node");    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;}

10. 常用命令

按时间截取

rosbag filter origin.bag new.bag "t.secs >= 576210103 and t.secs <= 576210303"

显示数据包信息

rosbag info data.bag

播放数据包

rosbag play data.bag

可视化

rqt_image_view

录包

rosbag record -help

查看消息

rostopic echo /radar_all_tracker | grep header -A4

转载地址:http://ykwt.baihongyu.com/

你可能感兴趣的文章
OpenCV在Google Colboratory中不起作用
查看>>
OpenCV学习(13) 细化算法(1)(转)
查看>>
OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
查看>>
OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
查看>>
OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
查看>>
OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
查看>>
OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
查看>>
OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
查看>>
OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
查看>>
OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型
查看>>
OpenCV安装
查看>>
OpenCV官方文档 理解k - means聚类
查看>>
opencv实现多路播放
查看>>
opencv常用函数
查看>>
OpenCV探索
查看>>
OpenCV添加中文(五)
查看>>
opencv源码查看
查看>>
OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
查看>>
opencv特征提取1-Harris角点检测
查看>>
OpenCV环境搭建(一)
查看>>