ROS软件包集合,像Navigation Stack,属于导航软件包集合,包含了与导航有关的软件包,例如地图软件包,路径规划软件包,TF坐标软件包,move_base移动控制软件包等,一整个stack下载后可以任意使用其中的软件包,每个软件包都实现其中一个或者好几个小功能,多个软件包组成集合实现一个完整的大的功能
http://wiki.ros.org/navigation
ROS程序的单元,每个软件包都包含程序库,可执行文件,脚本。图中列出的learning_joy软件包,包含编译配置文件CMakeLists.txt,include头文件库,launch启动脚本文件夹,package.xml软件包概况描述文件,src程序源码库
软件包文件详解:
节点是ROS机器人系统里任何操作的单元,可以理解为每一个节点可以实现一个小功能,一个机器人工程就是由多个节点组成的,节点与节点之间可以相互通信,相互协调完成工作,比如人手臂的运动,运动指令从大脑发出,经过肩膀,手肘,手腕,最后再到手指,触感的信息则是反过来传递,每个关节理解成一个节点,它们之间可能是相互传递消息,也可能是一个发送消息,一个接收消息;通常,我们在编程的时候就是编写一个个节点
话题是ROS里的一个通信方法,topic里包含了消息的名称,类型,内容,节点可以发布或者订阅某个或某几个话题,以此达到传递的目的;话题有两个重要的性质:a.话题的发布频率;b.话题的消息类型
ROS里的节点node可能是发布者或者是订阅者,甚至两者都兼备,发布者就是发布topic的节点,订阅者就是订阅topic的节点,发布者以一定的消息类型格式在ROS服务器上发布消息,订阅者则根据话题名称在服务器上订阅消息,消息类型在ROSwiki上有详细定义
http://wiki.ros.org/std_msgs
还有一些常用软件包内需要的消息类型,如:
common_msgs 查看各类消息类型
geometry_msgs 运动几何学相关的消息类型,包括速度,加速度等
sensor_msgs 传感器相关的消息类型,包括激光雷达,点云,IMU惯性测量单元,JoySticks遥控手柄,图像等
kevin@kevin-Laptop:~$ roscore
在编写任何ROS程序之前,都应该先建立一个工作空间workspace,因为使用catkin环境,所以一般网上很多教程都会将工作空间命名为catkin_ws,但其实可以任意命名,工作空间就是一个在~/home目录下的文件夹。工作空间下是存放软件包的,所以一般而言,工作空间不需要创建太多,除非某个工程特别庞大,才需要为它独立创建工作空间
创建工作空间目录:~$ mkdir -p catkin_ws/src
查看文件夹目录:tree catkin_ws/
编译软件包命令:~/catkin_ws$ catkin_make
即使没有源码文件,工作空间也是可以通过编译的,编译命令要在工作空间文件夹目录下执行,系统会自动生成build文件夹和devel文件夹,devel文件夹内的文件与引导路径有关系,没有source配置正确的环境变量路径,即使catkin_make编译通过,ROS也无法正确识别通过编译的节点
在工作空间目录下执行source命令:~/catkin_ws$ source devel/setup.bash
但这个命令只能在该终端内source到正确的环境变量,每次新打开一个终端,仍需要再次配置,可以修改整个环境:
$ gedit ~/.bashrc
把编辑文本拉到最后,添加:
source ~/catkin_ws/devel/setup.bash
就是添加工作空间下的/devel/setup.bash文件的路径,让终端每次打开时,都会自动执行source命令
配置完成后,按ctrl+alt+T打开终端,如果配置不正确,终端会提示找不到路径
软件包一般在工作空间的src文件夹下创建,否在ROS可能无法定位你的软件包,命名要避免与ROS的操作指令重复,不能以数字或者符号开头,并且不允许大写字母
创建软件包命令:
格式: catkin_create_pkg pkg_name pkg_depends
例子: catkin_create_pkg testing_pkg roscpp rospy std_msgs
$ rospack depends1 pkg_name
查看一级依赖关系 $ rospack depends pkg_name
查看所有的依赖关系软件包删除命令:$ rm -rf 文件夹名称
再重新编译
$ cd catkin_ws/src/testing_pkg/src/
$ gedit talker.cpp
$ gedit listener.cpp
如果没有gedit编辑器,系统会提示安装gedit $ sudo apt-get install gedit
$ catkin_make
#include "ros/ros.h"//ROS程序必备的头文件
#include "std_msgs/String.h"//传递的消息类型
#include "sstream"
int main(int argc, char **argv)//写ROS程序需要加argc,argv,因为init需要传这两个参数
{
ros::init(argc, argv, "talker");//初始化ros,向master注册一个叫“talker”的节点
ros::NodeHandle n;//初始化一个句柄,就是将ROS实例化
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
//发布者注册一个叫“chatter”的话题,<消息类型>,1000是消息队列大小
//消息队列相当于缓存消息,如果处理速度不够快的话消息会被保存在队列中
ros::Rate loop_rate(10);//执行循环的速率,可以理解为发布消息的频率,单位是Hz
int count = 0;
while (ros::ok())//ros::ok()函数用来判断master节点是否正常
{
std_msgs::String msg;//声明变量
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());//ROS_INFO()可以在终端打印数据
chatter_pub.publish(msg);//发布该消息
ros::spinOnce();//动作执行一次
//ros::spin()是循环执行,在没有while的时候使用
loop_rate.sleep();//相当于delay函数,因为程序可能不需要0.1s,就是10Hz的频率就可以发送完成,所以sleep()函数可以让程序暂停一会,让消息的发送频率符合10Hz
}
return 0;
}
wiki.ros.org/PublisherSubscriber
#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());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");//初始化ros,向master注册一个叫“listener”的节点
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
//订阅者向master注册自己需要订阅的话题"chatter",消息队列大小是1000,chatterCallback是回调函数
//回调函数的意义是,当订阅者从自己所订阅的话题上接收到消息,回调函数自动执行
ros::spin();//因为不在while循环体中,所以它要不断执行,而不是用spinOnce(),只执行一次
return 0;
}
wiki.ros.org/PublisherSubscriber
$ roscore
格式:$ rosrun your_pkg_name your_node_name
例子:$ rosrun testing_pkg talker
rosrun testing_pkg listener
$ cd catkin_ws/src/testing_pkg/
$ mkdir -p launch
$ cd launch
$ gedit testing_pkg.launch
语法格式
每个 xml 文件都包含根元素,根元素由 launch 标签来定义
// 开始标签
//type填写的是与CMakeLists.txt中add_executable修改的test_pkg_node.cpp名称一致
...
// 结束标签,结束标签都多一个 /
简单的launch文件
<launch>
"testing_pkg" type="talker" name="talker" output="screen"/>
"testing_pkg" type="listener" name="listener" output="screen"/>
launch>
$ ~/.ros/log/run_id/node_name-number-stour.log
拓展:jason来自星星的博客教程
格式:$ roslaunch pkg_name launch_name
例子:$ roslaunch testing_pkg testing_pkg.launch
$ rosrun rqt_graph rqt_graph
$ rosrun rqt_robot_steering rqt_robot_steering
Twist&/cmd_vel
rosrun rviz rviz
$ rosrun rqt_logger_level rqt_logger_level
rosrun rqt_console rqt_console