基础功能编程
Hint
操作环境及软硬件配置如下:
- OriginTank机器人
- PC:Ubuntu (≥22.04) + ROS2 (≥humble)
获取里程计消息
运行例程
启动机器人底盘后,在机器人或者PC端运行如下指令:
很快就可以在终端中看到里程计odom话题中的位置坐标:

代码实现
实现该功能的代码文件是origintank_demo/echo_odom.py,详细的实现过程如下:
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from nav_msgs.msg import Odometry # ROS2标准定义的里程计消息
"""
创建一个订阅者节点
"""
class SubscriberNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.sub = self.create_subscription(\
Odometry, "odom", self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)
def listener_callback(self, msg): # 创建回调函数,执行收到话题消息后对数据的处理
self.get_logger().info('Robot Position: "%0.2f, %0.2f"' \
% (msg.pose.pose.position.x, msg.pose.pose.position.y))
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = SubscriberNode("echo_odom") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
发布速度指令
运行例程
启动机器人底盘后,在机器人或者PC端运行如下指令:

启动成功后,就可以看到机器人开始做圆周运动:

代码实现
实现该功能的代码文件是origintank_demo/draw_circle.py,详细的实现过程如下:
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from geometry_msgs.msg import Twist # 速度话题的消息
"""
创建一个发布者节点
"""
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.pub = self.create_publisher(Twist, 'cmd_vel', 10) # 创建发布者对象(消息类型、话题名、队列长度)
self.timer = self.create_timer(0.5, self.timer_callback) # 创建一个定时器(单位为秒的周期,定时执行的回调函数)
def timer_callback(self): # 创建定时器周期执行的回调函数
twist = Twist() # 创建一个Twist类型的消息对象
twist.linear.x = 0.2 # 填充消息对象中的线速度
twist.angular.z = 0.8 # 填充消息对象中的角速度
self.pub.publish(twist) # 发布话题消息
self.get_logger().info('Publishing: "linear: %0.2f, angular: %0.2f"' % (twist.linear.x, twist.angular.z))
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = PublisherNode("draw_circle") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
