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

在学习完一到十章节的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)

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值