【从零搭建SLAM】2

【从零搭建SLAM】——ros机器人操作系统
1、ros是什么
ROS是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统,其底层还是由Linux操作系统完成,也就是说ROS实际上是运行在Linux上的次级操作系统。
2、ros结构
ROS的设计思路主要是分布式架构,将机器人的功能和软件做成一个个节点,然后每个节点通过topic进行通信。

ROS的核心概念主要是节点和用于节点间通信的话题与服务。管理器Master管理节点与话题之间通信的过程,并且还提供一个参数服务用于全局参数的配置。ROS通过功能包集stack和功能包package来组织代码。

ROS的核心模块包括:通信结构基础、机器人特性功能、工具集。通信结构基础主要是消息传递、记录回放消息、远程过程调用、分布式参数系统;机器人特性功能主要是标准机器人消息、机器人几何库、机器人描述语言、抢占式远程过程调用、诊断、位置估计、定位导航;工具集主要是命令式工具、可视化工具、图形化接口。

ROS核心工具很丰富,ROS常用命令工具是rostopic、rosservice、rosnode、rosparam、rosmsg、rossrv、roswtf
ROS常用可视化工具是rqt、rviz;ROS用于存储与回放数据的工具rosbag
ROS还拥有强大的第三方工具支持:三维仿真环境Gazebo、计算机视觉库OpenCV、点云库PCL、机械臂控制库MoveIt、工业应用库Industrial、机器人编程工具箱MRPT、实时控制库Orocos。
3、ros的整体架构
按照ROS官方的说法,我们可以从3个方面来理解ROS系统整体架构,这3个方面分别是文件系统级、计算图级、开源社区级。
文件系统:
在这里插入图片描述
计算图级
ROS会创建一个连接所有进程(节点)的网络,其中的任何进程(节点)都可以访问此网络,并通过该网络与其他进程(节点)交互,获取其他进程(节点)发布的信息,并将自身数据发布到网络上,这个计算图网络中的节点(node)、主题(topic)、服务(server)等都要有唯一的名称做标识,如图。
在这里插入图片描述
其实就时node和topic之间的一些关系。
4.编写一个rosrun程序

mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
catkin_init_workspace

cd ~/catkin_ws
catkin_make
添加环境变量:
source ~/catkin_ws/devel/setup.bash

在src下创建功能包
catkin_create_pkg hello_world
在src下创建cpp
touch my_hello_world_node.cpp
输入内容:

//hello world
#include "ros/ros.h"    //头文件ros/ros.h,必须在cmakelist中添加相应roscpp
int main(int argc,char**argv)
{
 ros::init(argc,argv,"hello_node"); //初始化ros并指定名称
 ros::NodeHandle nh;  //声明ros节点
 ROS_INFO_STREAM("hello world!!!"); //调用ROS_INFO_STRRAM来打印信息
}

为了成功编译,还需要对功能包下的cmakelists和package.xml进行修改
1、CMakeList中的find_package(catkin REQUIRED 添加代码如下)
find_package(catkin REQUIRED COMPONENTS roscpp)
2、还是CMakeLists中取消 ${catkin_INCLUDE_DIRS}的注释
3.package.xml中找到<buildtool_depend>catkin</buildtool_depend>
添加:

<build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>roscpp</exec_depend>

4.在CMakeLists中声明可执行文件:
在最后

add_executable(my_hello_world_node ~/catkin_ws/src/my_hello_world_node.cpp)
target_link_libraries(my_hello_world_node ${catkin_LIBRARIES})

第一行声明了我们想要的可执行文件的文件名,以及生成此可执行文件所需的源文件列表。如果你有多个源文件,把它们列在此处,并用空格将其区分开。
第二行告诉 Cmake 当链接此可执行文件时需要链接哪些库(在上面的 find_package 中定义)。如果你的包中包括多个可执行文件,为每一个可执行文件复制和修改上述两行代码。
回去编译

catkin_make

启动:

roscore
rosrun hello_world my_hello_world_node

完成。
5.编写消息发布和订阅(重要)
这里也是用的rosrun。

创建功能包
catkin_create_pkg topic_example roscpp std_msgs(指定了显示依赖roscpp和std_msgs)
在src下创建publish_node.cpp和subscribe_node.cpp

publis_node

#include "ros/ros.h"  //定义头文件,ros必须包含
#include "std_msgs/String.h" //代码中需要ros提供的标准消息类型std_msgs::String
#include <sstream>

int main(int argc, char **argv) 
{
  ros::init(argc, argv, "publish_node");//初始化指明节点名称
  ros::NodeHandle nh;//声明ros节点
  ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 1000);// \
  这句话告诉ros节点管理器我们将会在chatter这个话题上发布\
  std_msgs::String类型的消息。\这里的参数1000是表示发布序列的大小,如果消息发布的太快,\
  缓冲区中的消息大于1000个的话就会开始丢弃先前发布的消息。
  ros::Rate loop_rate(10);//指定循环的频率10Hz
  int count = 0;

  while (ros::ok()) 
  {
    std_msgs::String msg;

    std::stringstream ss; 
    ss << "how are you " << count; 
    msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());
  
    chatter_pub.publish(msg);
  
    ros::spinOnce();
    loop_rate.sleep();
    ++count;
  }//roscpp会默认安装以SIGINT句柄,这句话就是用来处理由ctrl+c键盘操作、该节点被另一同名节点踢出ROS网络、\
  ros::shutdown()被程序在某个地方调用、所有ros::NodeHandle句柄都被销毁等触发而使ros::ok()返回false值的情况。

  return 0;
}

subscribe_node

#include "ros/ros.h" 
#include "std_msgs/String.h" 

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]",msg->data.c_str());
}//这是一个回调函数,当有消息到达chatter话题时会自动被调用一次,\
这个回调函数里面就是一句话,用来打印从话题中订阅的消息数据。

int main(int argc, char **argv) 
{
  ros::init(argc, argv, "subscribe_node");
  ros::NodeHandle nh;

  ros::Subscriber chatter_sub = nh.subscribe("chatter", 1000,chatterCallback);// \
  与advertise时相对的

  ros::spin();//程序执行到这一句,就在这里不断自循环,\
  与此同时检查是否有消息到达并决定是否调用回调函数

  return 0;
}

在topic_example的Cmake中添加:

add_executable(publish_node src/publish_node.cpp)
target_link_libraries(publish_node ${catkin_LIBRARIES})

add_executable(subscribe_node src/subscribe_node.cpp)
target_link_libraries(subscribe_node ${catkin_LIBRARIES})

然后编译
catkin_make

启动:
roscore
rosrun topic_example publish_node
rosrun topic_example subscribe_node
请添加图片描述

这里也做一下roslaunch的工作空间建立的整理

rosluanch实现多节点:这个以后遇到再说

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值