ros文件结构
src | 代码空间(Source Space ) |
build | 编译空间(Build Space) |
devel | 开发空间(Development Space) |
install | 安装空间(Install Space |
退出虚拟环境
conda deactivate
创建工作空间
mkdir -p ~/catkin_ws/src#创建文件夹
cd ~/catkin_ws/src#进入目录
catkin_init_workspace#初始化,使其成为ROS的工作空间 属性配置为ros的工作空间
编译工作空间
cd .. #回到工作空间的根目录
catkin_make #在工作空间中执行编译
CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message):
Unable to find either executable 'empy' or Python module 'em'... try
installing the package 'python3-empy'
首次在工作空间的根目录下进行编译时,执行指定python
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
设置环境变量
source /home/chuanmei/catkin_ws/devel/setup.bash#该环境变量设置只对当前终端有效,chuanmei是用户名
#将上面命令放置到~/.bashrc文件中,让其对所有终端都有效
sudo nano ~/.bashrc
Nano是一个简单易用的文本编辑器,如果没有就按装一个
sudo apt install nano
sudo apt-get install nano
检查环境变量
echo $ROS_PACKAGE_PATH
创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_communication std_msgs rospy roscpp
#catkin_create_pkg 功能包名字 依赖
#std_msgs:定义的标准的数据结构
#rospy:提供python编程接口
#roscpp:提供c++编程接口
编译功能包
cd ~/catkin_ws
catkin_make
The specified base path "/home/chuanmei/catkin_ws" contains a CMakeLists.txt but "catkin_make" must be invoked in the root of workspace
解决办法
unlink /home/chuanmei/catkin_ws/CMakeLists.txt
发布者
1.初始化节点
2.注册节点信息
3.循环发布
订阅者
1.初始化节点
2.订阅话题
3.循环等待消息
4.完成消息处理
发布者 talker.cpp
#include<sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"
int main(int argc,char **argv){
//ROS节点初始化 定义节点名称为talker
ros::init(argc,argv,"talker");
//创建talker节点句柄
ros::NodeHandle n;
//创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
//设置循环的频率
ros::Rate loop_rate(10);//休眼时间0.1s工作下一轮
int count=0;
while(ros::ok()){
//初始化std_msgs::String类型的消息
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;
}
订阅者 listener.cpp
#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节点,节点名称为listener
ros::init(argc,argv,"listener");
//创建listener节点句柄
ros::NodeHandle n;
//创建一个订阅者Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
//循环等待回调函数
ros::spin();
return 0;
}
设置 CMakeLists.txt
add_executable(talker src/talker.cpp)
add_dependencies(talker ${PROJECT_NAME}_gencpp)
target_link_libraries(talker ${catkin_LIBRARIES})
#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(listener src/listener.cpp)
add_dependencies(listener ${PROJECT_NAME}_gencpp)
target_link_libraries(listener ${catkin_LIBRARIES})
#add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)
编译
cd ~/catkin_ws
catkin_make
运行
roscore
rosrun learning_communication talker
rosrun learning_communication listener
成功执行
自定义消息
生成文件夹 创建会话功能包
mkdir ~/catkin_ws/src/learning_communication/msg
创建文件
sudo nano Person.msg
编辑内容
string name
uint8 sex
uint8 age
float64 height
uint8 unknown=0
uint8 male=1
uint8 female=2
package.xml添加依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
#部分ROS版本中exec_depend要run_depend
CMakeLists.txt添加编译选项
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation #加入msg 必须加入的
)
配置msg源文件
Nano是文本编辑器
The dependency target “ros_communication_gencpp” of target “talker” does not exist
指定Cmake的最小版本要求
cmake_minimum_required(VERSION 2.8.3)
The dependency target “learning_communication_genergate_messages_cpp” of target “listener” does not exist
问题描述:在学习ROS话题通信时,使用catkin_make命令编译时出现上述错误
解决方案:
将
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
改为
add_dependencies(talker ${PROJECT_NAME}_gencpp)
代码如下
add_executable(talker src/talker.cpp)
add_dependencies(talker ${PROJECT_NAME}_gencpp)
target_link_libraries(talker ${catkin_LIBRARIES} )
add_executable(listener src/listener.cpp)
add_dependencies(listener ${PROJECT_NAME}_gencpp)
target_link_libraries(listener ${catkin_LIBRARIES} )