タートルシムからヘビまで...(補足)

元のテキストは次のとおりです。

タートルシムからヘビまで...


いくつかのヒント:

それを覚えてください、しかしそれを理解しないでください、それを非常に速く忘れてください!

包括的なプロジェクトケース1:スネークの実装
1.このプロジェクトを実現するには、どのような知識ポイントを使用する必要がありますか?
合計-ポイント
2.これらの知識ポイントを統合(合成)してこのケースを完了するにはどうすればよいですか?
3.この包括的なプロジェクトの各ナレッジポイントのコンポーネントまたは場所は何ですか?
4.プロジェクトの構想を完成させるための設計スキーム(ドラフト)?
5.各部品の機能をプログラムしてテストしますか?
6.このプロジェクトケースを実現するために、各パーツの機能を有機的に組み合わせますか?
小計
合成はユニットに分解され、ユニットは合成を形成します。
複雑は単純になり、単純は複雑になります

1.コンボイ現象!リーダーは
経路計画に責任があり、他の参加者はフォローする責任があります

2. turtlesimをグラフィカルに使用し、展開して新しいロボットを生成します(APIインターフェイスの代わりにcppコードで実装されます)。チームリーダーはキーボードのリモコンを使用する必要があります。

3.クラスターとSnake間の接続を変更して適用するにはどうすればよいですか?

4.上記の知識ポイントを使用して設計するにはどうすればよいですか?


問題のあるプログラムは次のとおりです(参照しないでください)。 



#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{

	ros::init(argc, argv, "my_tf_listener");


	ros::NodeHandle node;


	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv;
	add_turtle.call(srv);

	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle3 = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv3;
	add_turtle.call(srv3);

	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle4 = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv4;
	add_turtle.call(srv4);

	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle5 = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv5;
	add_turtle.call(srv5);

	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle6 = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv6;
	add_turtle.call(srv6);

	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle7 = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv7;
	add_turtle.call(srv7);







	ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);

	ros::Publisher turtle_vel3 = node.advertise<geometry_msgs::Twist>("/turtle3/cmd_vel", 10);

	ros::Publisher turtle_vel4 = node.advertise<geometry_msgs::Twist>("/turtle4/cmd_vel", 10);

	ros::Publisher turtle_vel5 = node.advertise<geometry_msgs::Twist>("/turtle5/cmd_vel", 10);

	ros::Publisher turtle_vel6 = node.advertise<geometry_msgs::Twist>("/turtle6/cmd_vel", 10);

	ros::Publisher turtle_vel7 = node.advertise<geometry_msgs::Twist>("/turtle7/cmd_vel", 10);


	tf::TransformListener listener;

	tf::TransformListener listener3;


	ros::Rate rate(10.0);
	while (node.ok())
	{
		// 
		tf::StampedTransform transform;
		try
		{
			listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));
			listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
		}
		catch (tf::TransformException &ex) 
		{
			ROS_ERROR("%s",ex.what());
			ros::Duration(1.0).sleep();
			continue;
		}

		// 
		geometry_msgs::Twist vel_msg;
		vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
				                        transform.getOrigin().x());
		vel_msg.linear.x = 2.0 * sqrt(pow(transform.getOrigin().x(), 2) +
				                      pow(transform.getOrigin().y(), 2));
		turtle_vel.publish(vel_msg);


		if(vel_msg.linear.x<0.01){
			// 
			tf::StampedTransform transform3;
			try
			{
				listener3.waitForTransform("/turtle3", "/turtle2", ros::Time(0), ros::Duration(3.0));
				listener3.lookupTransform("/turtle3", "/turtle2", ros::Time(0), transform);
			}
			catch (tf::TransformException &ex) 
			{
				ROS_ERROR("%s",ex.what());
				ros::Duration(1.0).sleep();
				continue;
			}

			// 
			geometry_msgs::Twist vel_msg3;
			vel_msg3.angular.z = 4.0 * atan2(transform3.getOrigin().y(),
						                transform3.getOrigin().x());
			vel_msg3.linear.x = 2.0 * sqrt(pow(transform3.getOrigin().x(), 2) +
						              pow(transform3.getOrigin().y(), 2));
			turtle_vel3.publish(vel_msg3);
		}

		rate.sleep();
	}
	return 0;
};

おすすめ

転載: blog.csdn.net/ZhangRelay/article/details/124205271