- 安装ros和构建依赖rosdep(初始化和更新)
- 配置ros环境变量(.bashrc)
测试ros:
1.启动核心结点:roscore
roscore包含什么?
rosmaster
ros 参数服务器
rosout 日志结点
2.启动普通结点:....................
创建工作空间:mkdir -p ws/src
编译工作空间:catkin_make(生成build文件夹和install文件夹)
理解:
build:存放cmake缓存文件,配置信息,
devel:存放编译后生成的目标文件
创建功能包:catkin_create_pkg 包名 依赖(roscpp rospy std_msgs)
注:roscpp c++实现的库 rospy Python实现的库 std_msgs标准信息库
功能包追加:cmake,package修改
创建功能包所安装的依赖
理解:
package.xml文件:包含创建功能包所包含的依赖(编译依赖,执行依赖)
写源代码:c++,python(一定要记得添加可执行权限)
//
1.python文件要放在:scripts(脚本文件中)
2.提升python文件权限
编辑配置文件:Cmakelist.txt python是为了确定解释器,可以通过软连接Python3,就可以不用配置cmake和python有关的cmake
修改启动结点的映射名
1.c++
# add_executable(${PROJECT_NAME}_node src/hello_world_node.cpp)
2.c++
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
3.(只有.py文件需要)指定解释器
# catkin_install_python(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
编译:工作空间去catkin_make编译
执行:
1.启动核心
2.配置环境变量:这将使得你能够在当前终端中使用已构建的ROS软件包,包括运行ROS节点、启动ROS程序等。
//可以放在.bashrc脚本文件中,就不需要每次手动输入
source ~/demo02_ws/devel/setup.bash
3.启动其他结点
vscode开发:
启动:
code ./demo02_ws 打开主文件夹下demo02_ws工作空间
ctrl+shift+b
- 一键配置task.json编译文件,方便日后可以直接快捷键编译
{
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
解决info输出乱码问题:
setlocale(LC_ALL,” ”);
C++
Python3
user_locale = locale.getdefaultlocale()
locale.setlocale(locale.LC_ALL, user_locale)
例:最简单结点
例:launch文件(日志输出:output=”screen”)
通信:数据交换
3种通信模式:
话题通信(发布订阅模式)
服务通信(请求响应模式)
参数服务器(参数共享模式)
话题通信:
master节点的管理发布方的话题和订阅者的话题
底层RPC,TCP协议都已经被封装了,只需要调用ok
例:
pub:持续发布文本信息
sub:接收文本信息
//std_msgs:依赖包 (发布的信息类型)
from std_msgs.msg import (各种消息类型)
Header, String, Bool, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64, ColorRGBA, Empty
//rospy库:
sub:回调函数,在创建订阅者对象就有了
rospy.spin()函数是一个阻塞调用,它使ROS节点保持活动状态,并允许它处理传入的消息并执行回调函数。它实际上启动了一个事件循环,等待订阅的话题上的消息到达,并触发相应的回调函数。
当调用rospy.spin()时,程序进入一个循环,并在节点被关闭之前一直保持在那里。在此期间,节点可以接收和处理消息、发布消息以及执行其他任务。
在ROS中,回调函数是一种常见的机制,用于处理订阅者(subscriber)接收到的消息。当订阅者监听的话题接收到新消息时,ROS会自动调用预先定义的回调函数来处理该消息。
回调函数的作用是根据接收到的消息执行特定的逻辑。通过编写回调函数,您可以定义自己的消息处理逻辑,例如解析消息内容、更新状态、执行特定的操作等。
在您提供的代码中,doMsg 函数就是一个回调函数。当订阅者接收到 "info" 话题上的消息时,ROS会调用 doMsg 函数,并将接收到的消息作为参数传递给它。在这个回调函数中,您可以根据需要访问和处理消息数据。
通过使用回调函数,您可以将消息处理与主循环(rospy.spin())分离开来,使节点可以同时接收和处理多个消息,而不会阻塞主循环。这种异步的消息处理方式可以提高节点的响应性和并发性。
此外,回调函数还允许您在消息到达时立即对其进行处理,而不需要手动轮询或等待消息的到达。这种事件驱动的方式可以更有效地利用系统资源并简化代码的编写。
因此,回调函数在ROS中是一种非常常见且有用的机制,它使您能够以异步、事件驱动的方式处理接收到的消息
话题通信消息自定义:
- 自定义msg文件
- 编辑配置文件
package
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
cmake
4个地方
- 产生两个中间文件
使用自定义消息:
- 配置setting文件,
服务通信:对于偶然的时间性要求,请求响应机制,是一种应答机制
顺序:
- 服务端必须先启动
- 然后在启动客户端
流程:
- master先匹配二者的供需(服务名要相同才能对接服务)
- 然后再具体执行
自定义服务消息:
请求部分
响应部分
- 写srv
- 该配置文件
package
cmake
- setting导入
传参:命令行
你提供的代码片段用于检查sys.argv的长度是否不等于3。如果条件为真,它将使用rospy.logerr()记录错误消息,并使用sys.exit(1)退出程序,返回状态码1。
sys.argv是Python中的一个列表,包含传递给脚本的命令行参数。它的第一个元素是脚本名称本身,其后是在运行脚本时提供的任何其他参数。
在这种情况下,代码片段期望有三个命令行参数。如果参数的数量不等于3,它会假定发生了错误,并使用rospy.logerr()记录错误消息。rospy模块通常用于Python中的ROS(机器人操作系统)。最后,调用sys.exit(1)来终止程序,并返回非零状态码,表示错误条件。
解决:客户端先启动,不报错,而是挂起
rospy.wait_service(“add”)
参数服务器:增删改查
键值对存储
类似于数据库,存储一些非二进制的简单数据,性能不高
rsoparam list
rosparam get ..
ROS命令行:
1.rosnode
2.rostopic
3.rosservice
4.rosmsg
5.rossrv
6.rosparam
YAML:序列化过程(写入文件)
运动学参数:
线速度
角速度
- 偏航
- 俯仰
- 翻滚
多结点应用:
RospyAPI
init_node()
实现同一个结点同时调用+随机数后缀
元功能包:虚包,创建是不需要任何依赖
如何创建?
- 普通包+不加依赖+修改cmake+package
launch文件标签:
1.launch
node
pkg
type
name
args(cmd param)
machine
ns
respawn
output=”screen | log”默认是log日志文件
include:将另一个XML文件导入到当前文件
传参技巧:
- 命令行传参 _参数名=??
- 请求响应 cmd传参
- package 中设置arg标签,cmd传参将其覆盖
包路径输出
解决节点重命名问题:
1.group
- sn设置
- 直接映射
- launch 启动修改
解决话题重命名
- remap from to
- 命令行直接修改
话题类型的作用域:
- 全局
- 相对
和节点的命名空间和平行
- 私有
添加:~
参数类型的作用域:
- rosrun 命令行
- launch 文件:
node下是私有的
<launch>是全局的
- 编码:
rospy.set_param()