博客
关于我
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/

你可能感兴趣的文章
mysql备份
查看>>
mysql备份与恢复
查看>>
mysql备份工具xtrabackup
查看>>
mysql备份恢复出错_尝试备份/恢复mysql数据库时出错
查看>>
mysql复制内容到一张新表
查看>>
mysql复制表结构和数据
查看>>
mysql复杂查询,优质题目
查看>>
MySQL外键约束
查看>>
MySQL多表关联on和where速度对比实测谁更快
查看>>
MySQL多表左右连接查询
查看>>
mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
查看>>
mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
查看>>
mysql如何删除数据表,被关联的数据表如何删除呢
查看>>
MySQL如何实现ACID ?
查看>>
mysql如何记录数据库响应时间
查看>>
MySQL子查询
查看>>
Mysql字段、索引操作
查看>>
mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
查看>>
mysql字段类型不一致导致的索引失效
查看>>
mysql字段类型介绍
查看>>