우분투 환경은 16.04 LTS 64비트입니다.
제가 simulator 노드에서 force_cmd
토픽으로 구독을하고 velocity
토픽으로 0.1초로 구독을하고 계산식을 하여 velocity
값을 토픽으로 내용이 나오게하고, control
노드에서 velocity
와 vel.cmd
를 구독하고, 같은 방식으로 force_cmd
를 0.1초로 발행하여 계산하여 control
에서는 force_cmd
토픽의 메세지 내용을 출력하려하는데, 두개 다 rosrun
을 시키면 무응답이고 화면에 아무런 출력이 나오지않습니다.
그래서 rostopic
을 사용하여 확인해 본 결과, 다 실행이 되는게 보이는데, 어떤점이 문제점인지 잘모르겠습니다… 아직 시작한지 2달정도 밖에 안되어 오류 찾기가 어려워 여기에 여쭤봅니다…
시뮬레이터 노드
#include <ros/ros.h>
#include <std_msgs/Float64.h>
double force = 0.0;
double mass = 1.0;
double velocity = 0.0;
void forceCmdCallback(const std_msgs::Float64::ConstPtr& msg)
{
force = msg->data;
}
int main(int argc, char** argv)
{
ros::init(argc, argv, “simulator_node”);
ros::NodeHandle nh;
ros::Subscriber force_cmd_sub = nh.subscribe("force_cmd", 10, forceCmdCallback);
ros::Publisher velocity_pub = nh.advertise<std_msgs::Float64>("velocity", 10);
ros::Rate rate(100);
while (ros::ok())
{
double acceleration = force / mass;
velocity += 0.01 * acceleration;
std_msgs::Float64 velocity_msg;
velocity_msg.data = velocity;
velocity_pub.publish(velocity_msg);
ros::spinOnce();
rate.sleep();
}
}
제어기 노드
#include <ros/ros.h>
#include <std_msgs/Float64.h>
double velocity_cmd = 0.0;
double velocity = 0.0;
double force_cmd = 0.0;
void velCmdCallback(const std_msgs::Float64::ConstPtr& msg)
{
velocity_cmd = msg->data;
}
void velocityCallback(const std_msgs::Float64::ConstPtr& msg)
{
velocity = msg->data;
}
int main(int argc, char** argv)
{
ros::init(argc, argv, “control_node”);
ros::NodeHandle nh;
ros::Subscriber vel_cmd_sub = nh.subscribe("vel_cmd", 10, velCmdCallback);
ros::Subscriber velocity_sub = nh.subscribe("velocity", 10, velocityCallback);
ros::Publisher force_cmd_pub = nh.advertise<std_msgs::Float64>("force_cmd", 10);
double K = 1.0;
ros::Rate rate(100);
while (ros::ok())
{
force_cmd = K * (velocity_cmd - velocity);
std_msgs::Float64 force_cmd_msg;
force_cmd_msg.data = force_cmd;
force_cmd_pub.publish(force_cmd_msg);
ros::spinOnce();
rate.sleep();
}
}