博客
关于我
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:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
Mysqldump参数大全(参数来源于mysql5.5.19源码)
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>