ROS学习1

本文详细介绍了在ROS环境中安装、构建依赖、配置环境变量、创建工作空间和功能包,涉及ROScore启动、节点管理、消息通信(话题和服务)、参数服务器以及launch文件的使用。
摘要由CSDN通过智能技术生成
  1. 安装ros和构建依赖rosdep(初始化和更新)
  2. 配置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

  1. 一键配置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中是一种非常常见且有用的机制,它使您能够以异步、事件驱动的方式处理接收到的消息

话题通信消息自定义:

  1. 自定义msg文件
  2. 编辑配置文件

package

<build_export_depend>message_generation</build_export_depend>

<exec_depend>message_runtime</exec_depend>

cmake

4个地方

  1. 产生两个中间文件

使用自定义消息:

  1. 配置setting文件,

服务通信:对于偶然的时间性要求,请求响应机制,是一种应答机制

顺序:

  1. 服务端必须先启动
  2. 然后在启动客户端

流程:

  1. master先匹配二者的供需(服务名要相同才能对接服务
  2. 然后再具体执行

自定义服务消息:

请求部分

响应部分

  1. 写srv
  2. 该配置文件

package

cmake

  1. 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:序列化过程(写入文件)

运动学参数:

线速度

角速度

  1. 偏航
  2. 俯仰
  3. 翻滚

多结点应用:

RospyAPI

init_node()

实现同一个结点同时调用+随机数后缀

元功能包:虚包,创建是不需要任何依赖

如何创建?

  1. 普通包+不加依赖+修改cmake+package

launch文件标签:
1.launch

node

pkg

type

name

args(cmd param)

machine

ns

respawn

output=”screen | log”默认是log日志文件

include:将另一个XML文件导入到当前文件

传参技巧:

  1. 命令行传参  _参数名=??
  2. 请求响应 cmd传参
  3. package 中设置arg标签,cmd传参将其覆盖

包路径输出

解决节点重命名问题:
1.group

  1. sn设置
  2. 直接映射
  3. launch 启动修改

解决话题重命名

  1. remap from  to
  2. 命令行直接修改

话题类型的作用域:

  1. 全局
  2. 相对

和节点的命名空间和平行

  1. 私有

添加:~

参数类型的作用域:

  1. rosrun 命令行
  2. launch 文件:

node下是私有的

<launch>是全局的

  1. 编码:

rospy.set_param()

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成也萧何,败也萧何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值