ROSはRobotOperating Systemの略です。この記事では、ROSアプリケーションの開発とサーバープログラミングについて紹介します。プログラムの機能は、ROSのサービス呼び出し機能を介してこのサービスを呼び出すことです。このサービスが呼び出されると、小さなカメが円を描くように命令が出され、その後の呼び出しは、カメが円を描くのを停止または開始するためのピンポン関数です。最初にC ++コード、次にPythonコード、あなたが精通しているものだけを見るように選択することもできます。
関数パッケージの作成
この記事は 、ROSアプリケーション開発の概要 におけるクライアントクライアントのプログラミングの続きです。この記事で関数パッケージを作成した場合は、ここでは必要ありません。このセクションをスキップしてください。
ROSのワークスペースは、 記事に設立されたROSの開発と応用の準備:ワークスペースを作成します。今、機能的なパッケージを作成します。:
cd〜 / catkin_ws / src
catkin_create_pkg Learning_service std_msgs roscpp rospygeometry_msgsturtlesim
最初の行は、ワークスペースのsrcディレクトリに戻ることです。関数パッケージの作成は、このディレクトリで実行する必要があります。
2行目は関数パッケージを作成するコマンド、最初のパラメーターは関数パッケージの名前、ここはlearning_service、次は関数パッケージの依存関係ライブラリ、ここはstd_msgs roscpp rospygeometry_msgsturtlesimです。5つの依存関係があります。ライブラリ。
上記のコマンドを実行すると、srcディレクトリの下にlearning_serviceという名前のディレクトリが表示されます。このディレクトリの内容は次のとおりです。
CMakeLists.txtにはpackage.xmlスクリプトが含まれますsrc
その中で、スクリプトは後でPythonコードを保存するために手動で作成されました。
c ++ソースコード
〜/ catkin_ws / src / Learning_service / srcディレクトリでもあるsrcディレクトリに、ファイルturtle_command_server.cppを作成します。
cd〜 // catkin_ws / src / Learning_service / src
nano turtle_command_server.cpp
内容は次のとおりです。
/**
* 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <std_srvs/Trigger.h>
ros::Publisher turtle_vel_pub;
bool pubCommand = false;
// service回调函数,输入参数req,输出参数res
bool commandCallback(std_srvs::Trigger::Request &req,
std_srvs::Trigger::Response &res)
{
pubCommand = !pubCommand;
// 显示请求数据
ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");
// 设置反馈数据
res.success = true;
res.message = "Change turtle command state!"
return true;
}
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "turtle_command_server");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个名为/turtle_command的server,注册回调函数commandCallback
ros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 循环等待回调函数
ROS_INFO("Ready to receive turtle command.");
// 设置循环的频率
ros::Rate loop_rate(10);
while(ros::ok())
{
// 查看一次回调函数队列
ros::spinOnce();
// 如果标志为true,则发布速度指令
if(pubCommand)
{
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
turtle_vel_pub.publish(vel_msg);
}
//按照循环频率延时
loop_rate.sleep();
}
return 0;
}
このコードには明確な注釈があります。これはサーバーを実装するための基本的なプロセスなので、ここでは繰り返しません。
cmakeファイルを構成する
〜/ catkin_ws / src / Learning_service /ディレクトリにCMakeLists.txtファイルがあり、このファイルを変更する必要があります
cd〜 / catkin_ws / src / Learning_service
nano CMakeLists.txt
このファイルに次の2行を追加します。
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
追加された場所はビルドの最後の部分です。次の場所を参照してください。これは、前にある## install ##です。
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})
#############
## Install ##
#############
turtle_spawnの2行は、クライアントの記事の内容です。追加後に保存し、終了します
これでコンパイルと構成は完了です。
テストをコンパイルして実行します
コンパイルは〜/ catkin_wsディレクトリに戻る必要があります
cd〜 / catkin_ws
catkin_make
コンパイル後に一度ソースする必要があります。
ソースdevel / setup.bash
コンパイルでエラーが発生した場合は、エラーを排除してからテストを実行する必要があります。
ターミナルを開き、rosを起動し、実行します
roscore
別のターミナルを開き、タートルを実行します
rosrun turtlesim turtlesim_node
上記はテスト環境を開始するためのものです。問題がある場合は、以下を参照してください 。ROSでのシミュレーションタートルですが、キーボードコントロールが開始されていません。
最後に、ターミナルで実行します。
rosrun Learning_service turtle_spawn_command_server
上記のコマンドを実行した後、ROSのサービス呼び出し機能を使用してこのサービスを呼び出す必要があります。
別のターミナルを開き、次のコマンドを入力します。
rosservice call / turtle_command
この呼び出しにはパラメータがありません。実行後、小さなカメが円を描いて回転していることがわかります。
上記のコマンドを再度実行すると、亀が停止してから実行されると、亀は再び円を描くように回転します。これはピンポンコントロールです。
これでc ++の開発は完了です。
Pythonコード
C ++と混同しないように、〜/ catkin_ws / src / Learning_service /ディレクトリの下にscriptsディレクトリを作成してから、このディレクトリに移動してturtle_command_server.pyファイルを作成します。
cd〜 / catkin_ws / src / Learning_service / scripts
nano turtle_command_server.py
ファイルの内容は次のとおりです。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger
import rospy
import thread,time
from geometry_msgs.msg import Twist
from std_srvs.srv import Trigger, TriggerResponse
pubCommand = False;
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
def command_thread():
while True:
if pubCommand:
vel_msg = Twist()
vel_msg.linear.x = 0.5
vel_msg.angular.z = 0.2
turtle_vel_pub.publish(vel_msg)
time.sleep(0.1)
def commandCallback(req):
global pubCommand
pubCommand = bool(1-pubCommand)
# 显示请求数据
rospy.loginfo("Publish turtle velocity command![%d]", pubCommand)
# 反馈数据
return TriggerResponse(1, "Change turtle command state!")
def turtle_command_server():
# ROS节点初始化
rospy.init_node('turtle_command_server')
# 创建一个名为/turtle_command的server,注册回调函数commandCallback
s = rospy.Service('/turtle_command', Trigger, commandCallback)
# 循环等待回调函数
print "Ready to receive turtle command."
thread.start_new_thread(command_thread, ())
rospy.spin()
if __name__ == "__main__":
turtle_command_server()
コードには明確な指示があるので、ここでは繰り返しません。
Python実行テスト
Pythonはコンパイルせずに直接実行できます。
turtle_command_server.pyを変更して実行属性を持たせる
chmod + x * .py
これはls-lで確認できます。
同時に、それは一度調達されるべきです:
ソース〜/ catkin_ws / devel / setup.bash
まず、テスト環境を開始する必要があります。1つの端末がroscoreを起動し、別の端末がturtle rosrun turtlesim turtlesim_nodeを起動します。問題がある場合は、以下を参照してください。ROSで のシミュレーションタートルですが、キーボードコントロールがアクティブになっていません。
次に、次のコマンドを実行します。
rosrun Learning_service turtle_command_server.py
上記のコマンドを実行した後、ROSのサービス呼び出し機能を使用してこのサービスを呼び出す必要があります。
別のターミナルを開き、次のコマンドを入力します。
rosservice call / turtle_command
この呼び出しにはパラメータがありません。実行後、小さなカメが円を描いて回転していることがわかります。
上記のコマンドを再度実行すると、亀が停止してから実行されると、亀は再び円を描くように回転します。これはピンポンコントロールです。
ソースコードはhttps://github.com/huchunxu/ros_21_tutorialsからダウンロードすることもできます
紹介は以上です。