ROS基础(一)——命令行代码(以小乌龟程序为例)

1 基础命令行语句

从大二四旋翼无人机编队后就没再接触过ROS了,最近由于科研任务需要重新捡起来,打算系统学一下!学习过程参考古月居老师的视频,有兴趣的同学可以去[BliBli]学习。

  • 学习平台:Ubuntu 18.04
  • 硬件支持:Redme G

1.1 roscore

启动Ros Master 即Ros节点控制器(几乎所有的Ros工作都需要输入这条命令)
首先启动小海龟仿真程序,输入如下指令:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

结果如图所示:
1  此时,可以在第三个命令行窗口下,通过方向键控制小乌龟移动。活用Tab键可以自动补全代码。

1.2 rqt_graph(显示系统计算图)

2

1.3 rosnode(显示所有节点相关信息)

可以输入rosnode,并双击Tab查看相关帮助信息
3

  • rosnode list 展示所有节点信息
  • rosnode info /turtlesim 展示特定节点的工作进程

1.4 rostopic(和话题相关)

可以直接通过此命令控制小龟移动: rostopic+话题名称+消息结构,如下命令:

 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0" 

 从图中可以看出,此指令只发布一次,小龟只会移动一小段,接下来尝试循环操作。
4
尝试以10Hz的频率持续发布命令:

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0" 

5
查看一下上述命令 geometry_msgs/Twist的格式:

6

2 服务类型指令rosservice

7

同时存在两只海龟

rosservice call /spawn 
"x: 2.0
y: 2.0
theta: 2.0
name: 'turtle2'" #定义海龟的初始位置和名字

8此时,查看当前节点数,可以看到已经出现了第二只小海龟的节点(可以同时控制两只海龟了呦)

rostopic list

9

10

3 指令记录

rosbag record -a -O cmd_record #话题纪录 record= 纪录 -a =all -O=保存为什么形式
rosbag play cmd_record.bag #话题复现

11
在这里插入图片描述

[1] : https://www.bilibili.com/video/BV1zt411G7Vn?from=search&seid=16813335425953229316&spm_id_from=333.337.0.0

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用Python编写在ROS2中让小乌龟画圆的代码: ``` # 导入需要的 Python 第三方库和 ROS2 模块 import math import rclpy from geometry_msgs.msg import Twist from turtlesim.msg import Pose # 初始化小乌龟的运动节点 class TurtleMotion: def __init__(self): # 创建节点对象 self.node = rclpy.create_node('turtle_motion') # 订阅小乌龟的位置 self.sub = self.node.create_subscription(Pose,'/turtle1/pose',self.pose_callback,10) # 发布小乌龟的速度 self.pub = self.node.create_publisher(Twist,'/turtle1/cmd_vel',10) # 设置小乌龟的线速度和角速度 self.tw = Twist() self.tw.linear.x = 0.5 self.tw.angular.z = 0.5 * math.pi / 180.0 # 定义小乌龟的方向和运动状态 self.current_direction = 0 self.move_state = 'forward' # 开始小乌龟的运动 self.motion() # 小乌龟的位置回调函数 def pose_callback(self, data): # 判断小乌龟是否走出边界 if (data.x > 11.0 or data.x < 0.1 or data.y > 11.0 or data.y < 0.1): self.node.get_logger().warn('out of boundary') self.node.destroy_node() rclpy.shutdown() else: # 判断小乌龟当前方向与运动状态 if (self.current_direction == 0 and self.move_state == 'forward'): if (data.theta >= 0 and data.theta < math.pi / 2.0): self.current_direction = 1 elif (self.current_direction == 1 and self.move_state == 'forward'): if (data.theta >= math.pi / 2.0 and data.theta < math.pi): self.current_direction = 2 elif (self.current_direction == 2 and self.move_state == 'forward'): if (data.theta >= -math.pi and data.theta < -math.pi / 2.0): self.current_direction = 3 elif (self.current_direction == 3 and self.move_state == 'forward'): if (data.theta >= -math.pi / 2.0 and data.theta < 0): self.current_direction = 0 self.move_state = 'finish' # 小乌龟的运动函数 def motion(self): # 发布速度消息,让小乌龟开始运动 self.pub.publish(self.tw) # 循环检查小乌龟运动状态 while rclpy.ok(): # 如果小乌龟到达圆心位置,则停止运动 if (self.move_state == 'finish'): self.tw.linear.x = 0 self.tw.angular.z = 0 self.pub.publish(self.tw) break # 运行小乌龟运动节点 def main(args=None): rclpy.init(args=args) turtle_motion = TurtleMotion() rclpy.spin(turtle_motion.node) turtle_motion.node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段代码的作用是定义了一个节点 `turtle_motion`,并通过 ROS2 中的 Twist 和 Pose 消息来分别控制小乌龟的运动和获取小乌龟的位置信息,实现了小乌龟画圆的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值