【从零搭建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实现多节点:这个以后遇到再说
332

被折叠的 条评论
为什么被折叠?



