1 工作空间
目录结构
- src:代码空间(Source Space)存放工程文件的文件夹。
- build:编译空间(Build Space)编译产生的中间文件(很少打开)。
- devel:开发空间(Development Space)编译完成的可执行文件和链接、环境配置的脚本。
创建工作空间
#创建工作空间
mkrdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
#编译工作空间
cd ~/catkin_ws
catkin_make
#设置环境变量
sudo vim ~/.zshrc
source ~/catkin_ws/devel/setup.zsh
source ~/.zshrc
#检查环境变量
echo $ROS_PACKAGE_PATH
#查看所有的变量
env | grep ros
创建功能包
#创建功能包
cd ~/catkin_ws/src
catkin_create_pkg myPackName std_msgs rospy roscpp
#编译功能包
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
- CMakeLists.txt:编译功能包的编译选项
- package.xml:管理功能包信息的文件(包括依赖等信息)
ROS通信编程
话题编程
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc,char **argv)
{
//ROS节点初始化
ros::init(argc,argv,"talker");
//创建节点句柄
ros::NodeHandle n;
//创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String,缓存空间1000
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
//设置循环的频率10Hz
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok()) //监测但前节点是否正常运行
{
//初始化消息
std_msgs::String msg;
std::stringstream ss;
ss << "hello ros" << count;
msg.data = ss.str();
//终端打印变量
ROS_INFO("I publish a message: %s",msg.data.c_str());
//发布消息
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
//按照巡回频率延时
loop_rate.sleep();
++count;
}
return 0;
}
#include "ros/ros.h"
#include "std_msgs/String.h"
//受到订阅的消息后,会进入消息回调函数
void chatterCallBack(const std_msgs::String::ConstPtr& msg)
{
//将收到的消息打印出来
ROS_INFO("I hear a message: %s",msg->data.c_str());
}
int main(int argc,char **argv)
{
//初始化ros节点
ros::init(argc,argv,"listener");
//创建节点句柄
ros::NodeHandle n;
//创建一个订阅者,订阅名为chatter的topic,消息类型为std_msgs::String,缓存空间1000,回调函数为chatterCallBack
ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallBack);
//循环并等待回调函数
ros::spin();
return 0;
}
include_directories(include ${catkin_INCLUDE_DIRS}) #包含ROS路径的依赖(ros的头文件)
add_executable(talker src/talker.cpp) #可执行文件名 文件目录
target_link_libraries(talker ${catkin_LIBRARIES}) #把库文件链接到可执行文件中
add_executable(listener src/listener.cpp) #可执行文件名 文件目录
target_link_libraries(listener ${catkin_LIBRARIES}) #把库文件链接到可执行文件中
自定义话题消息
- 在包下面创建一个msg文件加,再在文件夹里创建一个.msg文件,我这里创建了student.msg
string name
bool sex
Float32 height
bool male = true
bool female = false
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!-- 部分ROS版本中exec_depend需改成run_depend -->
#添加功能包
find_package(catkin REQUIRED COMPONENTS
...
message_generation
)
#添加具体依赖
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)
#添加具体msg文件
add_message_files(FILES student.msg)
generate_messages(DEPENDENCIES std_msgs)
ROS入门实操