从零学ROS
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建工作空间
工作空间主要有以下几个文件夹:
src:存放源码的文件
devel:用来存放一些编译完成后的可执行文件,环境变量配置的脚本等
build:存放编译过程中一些中间文件
install:与devel类似,一般安装
//如何创建工作空间??
//首先在根目录下使用mkdir命令依次创建catkin_ws文件夹与src文件夹
mkdir -p catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace//初始化工作空间
cd ..
catkin_make//编译
在工作空间创建完成后,需要对其进行环境配置
使用下面的命令
sudo gedit .bashrc
然后在最后添加环境变量
source ~/catkin_ws/devel/setup.bash
//这里我用的是.bash文件,也有.zsh。把bash换成.zsh就行
完成后检查环境变量是否正确
echo $ROS_PACKAGE_PATH
具体实现机器人功能的基本单元是功能包,如何创建功能包
cd catkin_ws/src
catkin_create_pkg package_name depend1 depend2 depend3.....
创建完的功能包:
在功能包中有以下几个文件
include:存放头文件的
src:存放功能包源码的
CMakeLists.txt:存放我们是怎么编译这个功能包的一些选项
package.xml:存放功能包的一些描述信息,并申明这个功能包会依赖哪些功能包
创建完成后,进行编译
cd ..
catkin_make
注:同一个工作空间中不允许存在多个同名的功能包的,但是不同工作空间下可以存在同名工作包。
工作空间的覆盖
当ROS不同工作空间中有同名的功能包,ROS该怎么调用呢?
用overlaying,按照系统变量中路径依次查找。
(1)工作空间的路径会依次在ROS_PACKAGE_PATH中进行记录
(2)后创建的工作空间的路径会放在ROS_PACKAGE_PATH的前面
(3)运行ROS时会先访问前面的路径,如果前面的路径中没有找到指定的功能包,就顺序查找后面的路径
二、ROS通信
1.话题
流程
(1)创建发布者
(2)创建订阅者
(3)添加编译选项
(4)运行可执行程序
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc , char **argv)
{
//init ros初始化ros
ros::init(argc,argv,"talker");
ros::NodeHandle n;//创建句柄
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);//创建发布者
ros::Rate loop_rate(10);//循环频率
int count =0;//发布的内容
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<< count;
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
如何创建发布者
(1)初始化ros节点
(2)向rosmaster注册节点信息,包括发布的话题名与消息类型
(3)按照一定频率发布
#include <ros/ros.h>
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)//回调函数,处理接受的信息
{
ROS_INFO("I Hear:[%s]",msg->data.c_str());
}
int main(int argc,char **argv)
{
ros::init(argc,argv ,"listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback);
ros::spin();
return 0;
}
两个cpp写完后还需要cd ..
,对CMakeLists.txt还进行配置
需要修改
add_exectuable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
target_link_libraries(talker ${catkin_LIBRARIES})
然后cd到catkin_ws下,进行编译
编译完成后进入devel中的lib下,会有talker与listener的可执行文件,运行
自定义话题
虽然ros提供很多消息类型,但是还是不能满足我们,因此我们可以自定义话题编程
(1)定义msg文件
(2)在package.xml文件中添加功能依赖包
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
(3)在CmakeLists.txt文件中添加编译项
find_package(..... message_generatiom)
catkin_package(CATKIN_DEPENDS geometry_msgs roscpp roscpp rospy std_msgs message_runtime)//此项目的依赖关系
add_message_file(FILE Person.msg)//增加消息文件
generate_messages(DEPENDENCIES std_msgs)//生成的信息依赖于std_msgs
在功能包src下面创建文件夹msg,创建Person.msg
在package.xml文件中添加依赖
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_message_files(
FILES
Person.msg
# Message2.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
然后回到catkin_ws进行编译