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

你可能感兴趣的文章
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
查看>>
org.hibernate.HibernateException: Unable to get the default Bean Validation factory
查看>>
org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
查看>>
SQL-CLR 类型映射 (LINQ to SQL)
查看>>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
查看>>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
查看>>
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded
查看>>
org.tinygroup.serviceprocessor-服务处理器
查看>>
org/eclipse/jetty/server/Connector : Unsupported major.minor version 52.0
查看>>
org/hibernate/validator/internal/engine
查看>>
Orleans框架------基于Actor模型生成分布式Id
查看>>
SQL-36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。
查看>>
ORM sqlachemy学习
查看>>
Ormlite数据库
查看>>
orm总结
查看>>
os.environ 没有设置环境变量
查看>>
os.path.join、dirname、splitext、split、makedirs、getcwd、listdir、sep等的用法
查看>>
os.removexattr 的 Python 文档——‘*‘(星号)参数是什么意思?
查看>>
os.system 在 Python 中不起作用
查看>>
OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
查看>>