在ROS1环境下,你可以使用turtlesim包来实现同时出现两只小海龟,并让其中一只跟随另一只。以下是一个简单的C++代码示例:
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>
// 全局变量
ros::Publisher turtle1_pub;
ros::Publisher turtle2_pub;
// 小海龟2跟随小海龟1移动函数
void followTurtle(const turtlesim::PoseConstPtr& pose)
{
// 获取小海龟1的位置信息
float turtle1_x = 5.54; // 假设小海龟1的初始位置为(5.54, 5.54)
float turtle1_y = 5.54;
// 计算小海龟2到小海龟1的距离
float distance = sqrt(pow(pose->x - turtle1_x, 2) + pow(pose->y - turtle1_y, 2));
// 如果距离小于某个阈值,则绕着小海龟1旋转
if (distance < 1.0)
{
geometry_msgs::Twist rotate_msg;
rotate_msg.angular.z = 0.4; // 设置角速度使其绕着自身旋转
turtle2_pub.publish(rotate_msg);
}
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "turtle_follow");
ros::NodeHandle nh;
// 创建发布器用于控制小海龟1和小海龟2
turtle1_pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
turtle2_pub = nh.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);
// 订阅小海龟1的位置信息
ros::Subscriber sub = nh.subscribe("/turtle1/pose", 10, followTurtle);
// 创建第二只小海龟
ros::ServiceClient spawn_client = nh.serviceClient<turtlesim::Spawn>("/spawn");
turtlesim::Spawn srv;
srv.request.x = 3.54; // 假设小海龟2的初始位置为(3.54, 3.54)
srv.request.y = 3.54;
srv.request.theta = 0.0;
spawn_client.call(srv);
ros::spin();
return 0;
}
在运行此代码之前,请确保已经安装了turtlesim包,并启动roscore。
上述示例中,我们订阅了名为”/turtle1/pose”的话题来获取小海龟1的位置信息。然后根据距离判断是否需要绕着小海龟1旋转,并通过发布器控制小海龟2的移动。
内容由零声教学AI助手提供,问题来源于学员提问




