5.6.5 乌龟护航实现(C++)

1.编写 launch 文件

功能包 cpp05_exercise 的 launch 目录下新建文件exer02_turtle_escort.launch.py,并编辑文件,输入如下内容:

from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess, DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration

def spawn(node_name,x=2.0,y=2.0,theta=0.0,turtle_name="turtle2"):
  return Node(package="cpp05_exercise", executable="exer01_tf_spawn",
              name=node_name,
              parameters=[{"x":x,"y":y,"theta":theta,"turtle_name":turtle_name}])

def tf_broadcaster(node_name,turtle_name="turtle1"):
  return Node(package="cpp05_exercise",executable="exer02_tf_broadcaster",
              name=node_name,
              parameters=[{"turtle_name":turtle_name}])

def escort(node_name,x="0.0",y="0.0",frame_id="turtle1",child_frame_id="escort1"):
  return Node(package="tf2_ros",executable="static_transform_publisher",
              name=node_name,
              arguments=["--x",x,"--y",y,"--frame-id",frame_id,"--child-frame-id",child_frame_id]
            )
def tf_listener(node_name,target_frame,source_frame):
  return Node(package="cpp05_exercise",executable="exer03_tf_listener",
              name=node_name,
              parameters=[{"target_frame":target_frame,"source_frame":source_frame}]
              )
def generate_launch_description():

    # 启动 turtlesim_node 节点
    turtlesim_node = Node(package="turtlesim", executable="turtlesim_node", name="t1")
    # 生成一只新乌龟
    spawn1 = spawn(node_name="spawn1")
    spawn2 = spawn(node_name="spawn2",x=2.0,y=7.0,turtle_name="turtle3")
    spawn3 = spawn(node_name="spawn3",x=7.0,y=2.0,theta=1.57,turtle_name="turtle4")
    # tf 广播
    tf_broadcaster1 = tf_broadcaster(node_name="tf_broadcaster1")
    tf_broadcaster2 = tf_broadcaster(node_name="tf_broadcaster2",turtle_name="turtle2")
    tf_broadcaster3 = tf_broadcaster(node_name="tf_broadcaster3",turtle_name="turtle3")
    tf_broadcaster4 = tf_broadcaster(node_name="tf_broadcaster4",turtle_name="turtle4")

    escort1 = escort(node_name="static_transform_publisher1",x="-1")
    escort2 = escort(node_name="static_transform_publisher2",y="1",child_frame_id="escort2")
    escort3 = escort(node_name="static_transform_publisher3",y="-1",child_frame_id="escort3")

    # tf 监听
    tf_listener1 = tf_listener(node_name="tf_listener1",target_frame="turtle2",source_frame="escort1")
    tf_listener2 = tf_listener(node_name="tf_listener2",target_frame="turtle3",source_frame="escort2")
    tf_listener3 = tf_listener(node_name="tf_listener3",target_frame="turtle4",source_frame="escort3")

    return LaunchDescription([turtlesim_node,spawn1,spawn2,spawn3,
            tf_broadcaster1,tf_broadcaster2,tf_broadcaster3,tf_broadcaster4,
            escort1,escort2,escort3,
            tf_listener1,tf_listener2,tf_listener3
    ])

2.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select cpp05_exercise

3.执行

当前工作空间下启动终端,输入如下命令运行launch文件:

. install/setup.bash 
ros2 launch cpp05_exercise exer02_turtle_escort.launch.py

此时窗口中会新生成三只乌龟,向原生乌龟 turtle1 运动,并会组成固定队形。

再新建终端,启动 turtlesim 键盘控制节点:

ros2 run turtlesim turtle_teleop_key

该终端下可以通过键盘控制 turtle1 运动,并且护航的乌龟会按照特定队形跟随 turtle1 运动。最终的运行结果与演示案例类似。

results matching ""

    No results matching ""