首页 > 其他分享 >ROS学习笔记总结篇(基础篇梳理)

ROS学习笔记总结篇(基础篇梳理)

时间:2024-07-14 21:26:58浏览次数:15  
标签:__ function py 笔记 rospy 终端 ROS 梳理 pkg

在学习完一到十章节的ros后,我们的ros基础篇也迎来了结束,因此,在这章节,我会做一个总结,将一到十章的内容之串起来,实操一遍,接下来我们直接进入实操!


一、创建一个工作空间

首先,按下ctrl+shift+T打开终端,创建一个新的ros工作空间。

#创建工作空间目录
mkdir -p syj_ws/src
#进入syj_ws工作空间目录
cd syj_ws
#编译工作空间,使其能够运行
catkin_make

最终结果是这样的:

二、创建一个功能包

首先,进入syj_ws工作空间中的src文件夹下,创建一个function_pkg功能包。

#进入src文件夹下
cd syj_ws/src/
#创建一个名为function_pkg的功能包
mkdir funtion_pkg

然后,添加依赖环境

catkin_create_pkg function_pkg std_msgs roscpp rospy

接着,进入syj_ws目录下,编译工作空间

cd syj_ws
catkin_make

最终,我们会看到

三、尝试使用ros节点和ros话题

打开四个终端,全部设置环境变量,一个终端用来打开master和roscore,第二个终端用来运行turtlesim_node节点(小乌龟),第三个终端用来运行turtle_teleop_key节点(小键盘),第四个终端用来显示ros话题和ros节点情况。

#首先在四个终端里分别设置环境变量
source syj_ws/devel/setup.bash
#第一个终端打开master和roscore大管家
roscore
#运行小乌龟节点
rosrun turtlesim turtlesim_node
#运行小乌龟控制器节点
rosrun turtlesim turtle_teleop_key

最后,在第四个终端上实行以下命令:

rostopic list
rosnode list

可以看到以下结果:

四、尝试使用rqt_console、rqt_logger_level和roslaunch

(1)rqt_console和rqt_logger_level

首先,还是打开四个终端,分别设置环境变量,第一个终端打开master和roscore,第二个终端运行turtlesim_node节点(小乌龟),第三个终端运行turtle_teleop_key节点(小键盘)。

#首先在四个终端里分别设置环境变量
source syj_ws/devel/setup.bash
#第一个终端打开master和roscore大管家
roscore
#运行小乌龟节点
rosrun turtlesim turtlesim_node
#运行小乌龟控制器节点
rosrun turtlesim turtle_teleop_key

在最后一个终端中使用下面的命令:

#运行日志
rosrun rqt_console rqt_console
#运行日志等级
rosrun rqt_logger_level rqt_logger_level

可以查看日志和日志等级,在ros中的现象如下图所示:

(2)对于roslaunch

首先,打开三个终端,分别设置环境变量,在第一个终端中,打开roscore和master,在第二个终端中,进入function_pkg功能包,创建launch文件夹,在launch文件夹中创建num.launch文件

#设置环境变量
source syj_ws/devel/setup.bash
#进入功能包目录下
roscd function_pkg
#创建一个launch文件夹和num.launch文件
mkdir -p launch/num.launch

然后,进入launch文件夹下,使用rosed命令,进入vim编辑器

#进入launch目录下
cd launch
#使用vim编辑器,在function_pkg功能包下编辑num.launch文件
rosed function_pkg num.launch

输入以下的代码:

<launch>
 
  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
 
  <group ns="turtlesim2"> 
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
  
  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>
 
</launch>

然后,输入:wq进行保存并退出,然后输入roslaunch命令:

roslaunch function_pkg num.launch

我们可以看到两个小乌龟被同时打开:

五、尝试使用ros消息和ros服务

(1)使用ros消息

首先,我们打开一个终端,在终端中设置环境变量,进入function_pkg功能包下,创建一个msg文件夹,专门用来存储msg文件(注:目录名称一定是msg文件夹),在msg文件夹下创建num.msg文件,打开num.msg文件,输入int64 num,保存并退出:
 

#设置环境变量
source syj_ws/devel/setup.bash
#进入function_pkg功能包
roscd function_pkg
#创建msg目录
mkdir msg
#创建num.msg文件
touch num.msg
#编辑num.msg文件
gedit num.msg

然后,添加接口和顺序依赖,打开package.xml文件,在最后添加两个依赖:

#接口依赖
<build_depend>message_generation</build_depend>
#顺序依赖
<exec_depend>message_runtime</exec_depend>

接着,打开CMakeList.txt文件,添加依赖,以及msg文件:

最后,进入syj_ws工作空间,并对工作空间进行编译:

catkin_make

最后,界面如下所示:

(2)使用ros服务

首先,进入function_pkg功能包,创建一个srv文件夹,创建AddTwoInts.srv文件,将rospy_tutorials功能包下的AddTwoInts.srv文件复制到工作空间中src/AddTwoInts.srv文件中。

roscd function_pkg
mkdir srv
cd srv
touch AddTwoInts.srv
roscp rospy_tutorials AddTwoInts.srv AddTwoInts.srv

然后,使用rossrv的显示命令,显示AddTwoInts.srv文件中的输出内容

rossrv show function_pkg/AddTwoInts.srv

我们会看到以下现象:

六、尝试使用python编写消息发布器和接收器

首先,打开终端,创建scripts脚本文件夹,创建talker.py发布器和listener.py接收器,并加入可执行权限:

roscd function_pkg
mkdir scripts
touch talker.py
touch listener.py
sudo chmod +x talker.py listener.py

然后,依次打开talker.py和listener.py文件,分别写入代码:

#指定一个解释器,使得ros能够认识python中的内容
#!/usr/bin/env python3
#导入python模块和std_msgs.msg模块中的String消息类型
import rospy
from std_msgs.msg import String
#定义了一个名为“talker”的函数
def talker():
    #创建发布者、话题名称、类型和消息接纳长度
    pub = rospy.Publisher('chatter',String,queue_size=10)
    #初始化节点名称并设置anonymous防止节点名称起冲突
    rospy.init_node("talker", anonymous = True)
    #设置循环频率为 10HZ
    rate = rospy.Rate(10)
    #在节点不关闭的情况下,生成一个字符串消息,并包含当前时间
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        #将生成的字符串输出到ROS日志上
        rospy.loginfo(hello_str)
        #将字符串发布到chatter话题上
        pub.publish(hello_str)
        rate.sleep()

#在脚本作为主程序运行时,调用“talker”函数,如果捕捉到rospy.ROSInteruptExecption异常情况,则什么都
不用做
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInteruptExecption:
        pass
#!/usr/bin/env python3

import rospy
from std_msgs.msg import String
#定义一个召回函数,永安里接受data数据的,并且打印消息内容
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
#定义了一个listener的函数
def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber('chatter',String, callback)
    #进入ROS循环
    rospy.spin()
#如果作为主函数,调用listener函数
if __name__ == '__main__':
    listener()

点击保存,并打开三个终端,分别设置环境变量,第一个终端打开roscore和master,第二个终端运行talker.py,第三个终端运行listener.py。

source syj_ws/devel/setup.bash
roscore
rosrun function_pkg talker.py
rosrun function_pkg listener.py

最后,ros终端显示如下所示:

七、尝试使用python编写服务器和客户端

首先,打开终端,设置环境变量,进入scripts目录下,创建service.py服务器文件和client.py客户端文件。

source syj_ws/devel/setup.bash
roscd function_pkg
cd scripts
touch service.py
touch client.py

在service.py服务器文件和client.py客户端文件分别输入代码:

#!/usr/bin/env python3

from __future__ import print_function
from test_pkg.srv import AddTwoInts,AddTwoIntsResponse
import rospy

def handle_add_two_ints(req):
    print('Returing [%s + %s = %s]'%(req.a, req.b, (req.a + req.b)))
    return AddTwoIntsResponse(req.a + req.b)

def add_two_ints_server():
    rospy.init_node('add_two_ints_sever')
    s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
    print('Ready to add two ints')
    rospy.spin()

if __name__ == '__main__':
    add_two_ints_server()
#!/usr/bin/env python3

from __future__ import print_function

import rospy
import sys
from test_pkg.srv import *

def add_two_ints_client(x,y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints',AddTwoInts)
        resp1 = add_two_ints(x,y)
        return resp1.sum
    except rospy.ServiceException as e:
        print('Service call failed:%s'%e)

def usage():
    return '%s [x y]'%sys.argv[0]

if __name__ == '__main__':
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print(usage())
        sys.exit(1)
    print('Requesting %s + %s'%(x,y))
    print('%s + %s = %s'%(x, y, add_two_ints_client(x,y)))

最后,我们在ros中看到如下所示现象:

八、尝试使用rosbag录制数据并回放数据

首先,打开四个终端,分别设置环境变量,第一个终端打开roscore和master,第二个终端运行turtlesim_node节点(小乌龟),第三个终端运行turtle_teleop_key节点(小键盘)

source syj_ws/devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

在第四个终端中,运行rosbag记录数据命令:

rosbag record -a

然后,将保存在工作空间的数据进行回访,使用rosbag回放数据命令:

rosbag play 2024-07-14-06-06-08.bag

最后,我们看到以下现象:

可以看到,小乌龟沿着我们刚刚记录的路线又走了一遍,这代表rosbag记录数据和回放数据的使用是成功的。

至此,我们对于ros基础部分的学习已经完成,我们完成了每一部分的详细学习,完成了将之前的学习进行串联的操作,对过去几天的学习进行了一个总结,接下来,我们会学习python的基本用法!!!(p≧w≦q)

标签:__,function,py,笔记,rospy,终端,ROS,梳理,pkg
From: https://blog.csdn.net/tommorrowwill/article/details/140405922

相关文章

  • 八股文笔记(持续更新)
    提示:本笔记基于【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】https://www.bilibili.com/video/BV1yT411H7YK?p=7&vd_source=a91dafe0f846ad7bd19625e392cf76d8总结面试职业技能总结如何找的合适的项目项目模块的深度学习如何深......
  • Reinforced Causal Explainer for GNN论文笔记
    论文:TPAMI2023 图神经网络的强化因果解释器论文代码地址:代码目录AbstractIntroductionPRELIMINARIESCausalAttributionofaHolisticSubgraph​individualcausaleffect(ICE)​*CausalScreeningofanEdgeSequenceReinforcedCausalExplainer(RC-Explaine......
  • java_day1学习笔记
    title:Java_Day_1学习笔记data:2024-07-09tags:Java学前简述学习方法为什么学?技术控?项目需求?作业要求?方法?现有技术能解决?现有技术能完美解决?新技术和知识点?根据需求有针对点的学习怎么学?基本原理和基本语法(不考虑细节,快速过一遍),不要先考虑细节,因为细......
  • 失败笔记本--OPENCV--001--202407
    失败笔记本-OPENCV篇-001项目场景:今天研究一下用OPENCV基于轮廓分析查找数字,参考地址为:OpenCV案例|基于轮廓分析查找数字实现的效果如下:1.打开一张图片步骤:首先呢还是丝滑小连招,打开图片,灰度化,二值化在opencv中使用imread打开图片,使用imshow展示图片,不过要注意在ims......
  • 十万字梳理,带你拿下Java面试题(含答案解析)!
    马上金九银十很多同学/朋友都在忙着找工作,小五给大家整理了一份非常全面的Java面试题含答案总结!从java面试新手到java面试专家,你只差这一份面试题!还不赶紧拿下~内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、Spri......
  • Java笔记之HashMap
    HashMap的实现原理HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap底层就是一......
  • Java笔记之ThreadLocal
    定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。原理:Thread类有一个类型ThreadLocalMap的实例变量ThreadLocals,每个线程都有一个......
  • 《项目管理》-笔记2
    1.项目集定义项目集是一组相互关联且被协调管理的项目、子项目集和项目集活动,以便获得分别管理所无法获得的利益。项目集有三个核心特征:(1)多个项目(2)统一战略目标(3)统一配置资源项目组合管理利用了MPT的概念,并且也应用了三个关键评估标准来衡量项目:项目承担的成本、存在的风险......
  • HarmonyOS NEXT 学习笔记3--登录页面(数据绑定)
    1.代码:import{promptAction}from'@kit.ArkUI'@Entry@ComponentstructPage_textInput_onchange{//@StateUI刷新测试[注意:不是双向绑定]username:string=''password:string=''build(){Column({space:20}){......
  • 关于51单片机LED板块的学习笔记
    首先看看常见LED灯的内部结构其次下面是MCU原理图上关于LED的部分右侧VCC代表正极,左接两组电阻,目的保护电路,然后是八个LED,左侧有P20到P27八个接口接到下图CPU的对应接口上。这是工作原理图CPU经过一系列的信号传输把信号以高低电平的形式传给LED,因为LED右端始终接正极V......