2017-06-01 28 views
1

私はROSのturtlesimチュートリアルの課題に取り組んでいます。roslaunchでパラメータの初期値を設定する

起動ファイルex74.launchは、4つのノードを起動します:

-the turtlesim node (animates the movement of the turtle)
- pubvel (publishes random angular and linear velocity commands)
- vel_filter (subscribes to the topic on which pubvel publishes. This node filters the angular velocities and publishes only the messages with an angular velocity smaller than the parameter max_ang_vel)
- vel_printer (prints the filtered velocities)

スクリプトと起動ファイルは私の質問の最後に与えられています。

max_ang_velの初期値を設定し、コマンドラインから変更することが目標です。 0が

は、誰もが私を助けることができている

link to error

vel_filterからまた、すべての角度や線速度

vel_printer:私は起動ファイルを実行すると

はしかし、私は次のエラーを取得しますこれを解決する?

ありがとうございます!

ex74.launch

<launch> 
<node 
pkg="turtlesim" 
type="turtlesim_node" 
name="turtlesim" 
/> ## launch animation of turtle 

<node 
pkg="me41025_74" 
type="pubvel" 
name="publish_velocity" 
required="true" 
launch-prefix="xterm -e" 
output="screen" 
/> ## launch pubvel 

<node 
pkg="me41025_74" 
type="vel_filter" 
name="filter_velocity" 
required="true" 
launch-prefix="xterm -e" 
output="screen" 
> ## launch vel_filter 
<param name="max_ang_vel" value="0.1" /> 
</node> 

<node 
pkg="me41025_74" 
type="vel_printer" 
name="print_velocity" 
launch-prefix="xterm -e" 
output="screen" 
/> ## launch vel_printer 

</launch> 

pubvel

#include <ros/ros.h> 
#include <geometry_msgs/Twist.h> 
#include <stdlib.h> 

int main(int argc, char**argv){ 
ros::init(argc, argv, "publish_velocity"); 
ros::NodeHandle nh; 

ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1000); 

srand(time(0)); 

ros::Rate rate(2); 
int count_pubvel = 1; 
while(ros::ok()){ 
geometry_msgs::Twist msg; 
msg.linear.x = double(rand())/double(RAND_MAX); 
msg.angular.z = 2*double(rand())/double(RAND_MAX) - 1; 

pub.publish(msg); 

ROS_INFO_STREAM("Sending random velocity command:"<<" linear="<<msg.linear.x<<" angular="<<msg.angular.z); 

rate.sleep(); 
} 
} 

vel_filter

#include <ros/ros.h> 
#include <geometry_msgs/Twist.h> 
#include <turtlesim/Pose.h> 
#include <stdlib.h> 

float linx, angZ; 

void filterVelocityCallback(const geometry_msgs::Twist& msg){ 
    //Using the callback function just for subscribing 
    //Subscribing the message and storing it in 'linx' and 'angZ' 
    linx = msg.linear.x;  angZ = msg.angular.z; 
} 

int main(int argc, char **argv){ 
    ros::init(argc, argv, "filter_velocity"); 
    ros::NodeHandle nh; 
    ros::Subscriber sub = nh.subscribe("turtle1/cmd_vel",1000,&filterVelocityCallback); 
    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("turtle1/pose", 1000); 

const std::string PARAM_NAME = "~max_ang_vel"; 
double maxAngVel; 
bool ok = ros::param::get(PARAM_NAME, maxAngVel); 
if(!ok) { 
ROS_FATAL_STREAM("Could not get parameter " << PARAM_NAME); 
exit(1); 
} 

    ros::Rate rate(2); 

    while(ros::ok()){ 
    geometry_msgs::Twist msg; 
    msg.linear.x = linx;  msg.angular.z = angZ; 

    if (angZ < maxAngVel){ 
     ROS_INFO_STREAM("Subscriber velocities:"<<" linear="<<linx<<" angular="<<angZ); 

     pub.publish(msg); 
    } 
    rate.sleep(); 
    } 
} 

vel_printer

#include <ros/ros.h> 
#include <geometry_msgs/Twist.h> 
#include <iomanip> 

void printVelocityReceived(const geometry_msgs::Twist& msg){ 
ROS_INFO_STREAM("Filtered velocities:"<<" linear="<<msg.linear.x<<" angular="<<msg.angular.z); 
} 

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

ros::init(argc, argv, "print_velocity"); 
ros::NodeHandle nh; 

ros::Subscriber sub = nh.subscribe("turtle1/pose",1000,&printVelocityReceived); 

ros::spin(); 
} 

答えて

0

コードに2つの誤りがあります。

1.)あなたが間違ったメッセージタイプを聞いているので、あなたが得ているエラーがあります。 turtlesim documentationでは、あなたがvel_printer中に聴いているトピックは、タイプgeometry_msgsではないこと::ツイストあなたが書いたように見ますが、タイプturtlesim/Poseのことができます。これがエラーの原因です。また、私はあなたがメッセージを受信するためにConstPtrを使用することをお勧めします。亀のポーズのためのコールバック関数は、したがって、次のようになります。

void printVelocityReceived(const turtlesim::Pose::ConstPtr& msg){ ... do your magic ... }

2)パラメータ。起動ファイルで、パラメータサーバにパラメータmax_ang_velを公開しています。 タグ内でこれを実行しているため、このノードでは非公開にしています。ノードのプライベートパラメータを読み取るには、別のノードハンドルを指定する必要があります。次に、node handle's functionsを使用してパラメータにアクセスできます。

本の例:

int main(int argc, char** argv) 
{ 
    ros::init(argc, argv, "test"); 
    ros::NodeHandle nh; // public node handle 
    ros::NodeHandle nh_privat("~"); // private node handle 

    // Get the parameter. 
    nh_privat.param("max_ang_vel", maxAngVel, 0.0); 
    // first argument: name of the parameter on the parameter server 
    // second argument: variable to save it to 
    // third argument: default value if the parameter is not set 
} 

とコンソールからmaxAngVelを変更するために、あなただけの標準C++を使用することができますし、コンソールに入力を読み込み、それに応じて変数を変更します。

+0

こんにちはmaetulj。お返事をありがとうございます。 2番目の部分は動作しているようですが、最初の部分はa)がPose ::の後にエクスクルードされるというエラーを出します。どうすればこの問題を解決できますか? – user7845839

+0

ちょっと@ user7845839あなたはおそらくコンパイラから完全なエラーを書くことができますか?私はチェックし、turtlesim :: PoseはConstPtrを定義しているはずです... – maetulj

関連する問題