参考链接:
Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
一、准备工作
首次使用:配置环境变量,方便在任意 终端中使用 ROS。
echo "source /opt/ros/你的ros版本/setup.bash" >> ~/.bashrc
source ~/.bashrc
1.创建工作空间并初始化
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make
2.进入 src 创建 ros 包并添加依赖
cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
3.进入 ros 包的 src 目录编辑源文件 .cpp
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");//防止中文乱码
ros::init(argc,argv,"起个节点名");//节点初始化
ros::NodeHandle nh;//初始化句柄
ros::Subscriber sub = nh.subscribe<消息类型>("话题",1000,回调函数);
ros::spin();//用回调函数的时,官方建议使用
return 0;
}
配置cmake文件:
add_executable(步骤3的源文件名 src/步骤3的源文件名.cpp)
target_link_libraries(步骤3的源文件名 ${catkin_LIBRARIES})
4.执行
开一个新的终端,启动命令行1:
roscore
再启动命令行2:
cd 工作空间
source ./devel/setup.bash
catkin_make
rosrun ros功能包名 C++源文件名
二、话题通信自定义话题消息:
1.定义msg文件
在自定义ros包下新建 msg (文件夹)目录,添加文件 ****.msg
2.编辑配置文件
package.xml中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt编辑 msg 相关配置
find_package()指当前自定义功能包依赖的包
catkin_package()指依赖包所依赖的功能包
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
## 配置 msg 源文件
add_message_files(
FILES
Person.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
4.VScode配置 ctrl+shift+P
{
"configurations": [
{
"browse": {
"databaseFilename": "${default}",
"limitSymbolsToIncludedHeaders": false
},
"includePath": [
"/opt/ros/noetic/include/**",//ros代码提示
"/home/fengwenyue/rostest/src/mypkg/include/**",//
"/home/fengwenyue/rostest/devel/include/**",//配置头文件的路径
"/usr/include/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++17"//代码提示
}
],
"version": 4
}
5.cpp文件中引入自定义msg
#include "自定义包名/****.msg"
6.编写c++文件
7.根据c++文件配置cmake文件(在一的基础上添加这一句)
add_dependencies()用以设置所依赖的消息相关的中间文件。
add_dependencies(c++文件名 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
三、服务通信自定义话题消息:
1.定义srv文件
服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用---
分割,具体实现如下:功能包下新建 srv 目录,添加 xxx.srv 文件
2.编辑配置文件 package.xml中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt编辑 srv 相关配置
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(
FILES
AddInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
3.编译 编译后的中间文件查看: C++ 需要调用的中间文件(.../工作空间/devel/include/包名/xxx.h)
4.vscode配置:配置c_cpp_properies.json 文件
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
],
5.编写服务端客户端c++代码
6.c++文件 配置 CMakeLists.txt(同二)
7.编译(同一)
四、常用命令
1.话题通信
rostopic bw 显示主题使用的带宽
rostopic delay 显示带有 header 的主题延迟
rostopic echo 打印消息到屏幕
rostopic find 根据类型查找主题
rostopic hz 显示主题的发布频率
rostopic info 显示主题相关信息
rostopic list 显示所有活动状态下的主题
rostopic pub 将数据发布到主题
rostopic type 打印主题类型
rosmsg show 显示消息描述
rosmsg info 显示消息信息
rosmsg list 列出所有消息
rosmsg md5 显示 md5 加密后的消息
rosmsg package 显示某个功能包下的所有消息
rosmsg packages 列出包含消息的功能包
常用笔记:
rostopic list (查看话题)
rostopic info /话题 (可查看消息类型Type)
rosmsg infor 消息 (查看消息数据格式)
2.服务通信
rosservice args 打印服务参数
rosservice call 使用提供的参数调用服务
rosservice find 按照服务类型查找服务
rosservice info 打印有关服务的信息
rosservice list 列出所有活动的服务
rosservice type 打印服务类型
rosservice uri 打印服务的 ROSRPC uri
rossrv show 显示服务消息详情
rossrv info 显示服务消息相关信息
rossrv list 列出所有服务信息
rossrv md5 显示 md5 加密后的服务消息
rossrv package 显示某个包下所有服务消息
rossrv packages 显示包含服务消息的所有包
常用笔记:
rosservice list (查看话题)
rosservice info /话题 (可查看消息类型Type)
rossrv infor 消息 (查看消息数据格式)
3.参数服务(一般在代码里设置参数和获取参数,该命令常用于测试)
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从外部文件加载参数
rosparam dump 将参数写出到外部文件
rosparam delete 删除参数
rosparam list 列出所有参数