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