3 #include "geometry_msgs/Twist.h" 4 #include "gazebo_msgs/SetModelState.h" 5 #include "gazebo_msgs/GetModelState.h" 6 #include "sensor_msgs/CameraInfo.h" 7 #include <image_transport/image_transport.h> 8 #include "std_msgs/String.h" 9 #include <sensor_msgs/Image.h> 10 #include <sensor_msgs/image_encodings.h> 11 #include <cv_bridge/cv_bridge.h> 13 #include <opencv2/opencv.hpp> 14 #include <opencv2/core/core.hpp> 15 #include <opencv2/highgui/highgui.hpp> 16 #include <opencv2/imgproc/imgproc.hpp> 22 #include <sys/types.h> 23 #include <netinet/in.h> 24 #include <sys/socket.h> 27 #include <netinet/tcp.h> 44 cv::Mat
shortImg(480, 640, CV_16UC1);
49 image_transport::ImageTransport*
it;
96 printf(
"rgb callback, robot index: %s\n", rbtID.c_str());
100 cv_bridge::CvImagePtr cvImgPtr;
105 cvImgPtr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
106 rgbPass = cvImgPtr->image;
108 catch(cv_bridge::Exception& e)
110 ROS_ERROR(
"cv_bridge exception: %s", e.what());
119 printf(
"depth callback, robot index: %s\n", rbtID.c_str());
123 cv_bridge::CvImagePtr cvImgPtr;
128 cvImgPtr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::TYPE_32FC1);
129 depthImg = cvImgPtr->image;
131 catch(cv_bridge::Exception& e)
133 ROS_ERROR(
"cv_bridge exception: %s", e.what());
136 cv::Mat shortPass(480, 640, CV_16UC1);
138 for (
int i = 0; i < 480; ++i)
140 for (
int j = 0; j < 640; ++j)
142 shortPass.ptr<
short>(i)[j] = (
short)(depthImg.ptr<
float>(i)[j] * 1000);
150 gazebo_msgs::GetModelState getmodelstate;
152 sprintf(s,
"robot_%d",
id);
153 getmodelstate.request.model_name = (std::string) s;
155 if (gclient.
call(getmodelstate))
163 pose[0] = getmodelstate.response.pose.position.x;
164 pose[1] = getmodelstate.response.pose.position.y;
165 pose[2] = getmodelstate.response.pose.position.z;
166 pose[3] = getmodelstate.response.pose.orientation.x;
167 pose[4] = getmodelstate.response.pose.orientation.y;
168 pose[5] = getmodelstate.response.pose.orientation.z;
169 pose[6] = getmodelstate.response.pose.orientation.w;
173 void setForPose(
int id,
float x,
float y,
float z,
float qx,
float qy,
float qz,
float qw){
175 printf(
"set pose for robot %d...",
id);
177 gazebo_msgs::SetModelState setmodelstate;
180 sprintf(s,
"robot_%d",
id);
181 geometry_msgs::Pose posemsg;
182 posemsg.position.x = x;
183 posemsg.position.y = y;
184 posemsg.position.z = z;
185 posemsg.orientation.x = qx;
186 posemsg.orientation.y = qy;
187 posemsg.orientation.z = qz;
188 posemsg.orientation.w = qw;
189 gazebo_msgs::ModelState modelstate;
190 modelstate.pose = posemsg;
191 modelstate.model_name = (std::string) s;
192 setmodelstate.request.model_state = modelstate;
193 if (sclient.
call(setmodelstate)){}
197 printf(
" succeed.\n");
210 memset (buf, 0, len);
216 int status = recv(client_fd, buf_tem,
MAXRECV, 0);
217 memcpy(buf+i, buf_tem, status);
226 printf(
"status == -1 errno == %s in Socket::recv\n",errno);
229 else if( status == 0 )
249 int status = send(client_fd, ch, len, 0);
268 n = send(client_fd, buf+total, bytesleft, 0);
269 if (n == -1) {
break; }
289 int data_len = 480 * 640 * 3 *
sizeof(uchar) *
rbtnum;
290 char* rgbData = (
char *)malloc(data_len);
295 rgbData = (
char *)malloc(data_len);
300 for (
int rid = 0; rid <
rbtnum; ++rid)
302 for (
int i = 0; i < 480; ++i)
304 for (
int j = 0; j < 640; ++j)
306 memcpy(&rgbData[ind], &
crt_rgb_images[rid].ptr<cv::Vec3b>(i)[j][0],
sizeof(uchar));
308 memcpy(&rgbData[ind], &
crt_rgb_images[rid].ptr<cv::Vec3b>(i)[j][1],
sizeof(uchar));
310 memcpy(&rgbData[ind], &
crt_rgb_images[rid].ptr<cv::Vec3b>(i)[j][2],
sizeof(uchar));
317 printf(
"rgb data %d byte send back done. rtnCode = %d\n", data_len, rtnCode);
323 int data_len = 480 * 640 *
sizeof(short) *
rbtnum;
324 char* depthData = (
char *)malloc(data_len);
328 depthData = (
char *)malloc(data_len);
333 for (
int rid = 0; rid <
rbtnum; ++rid)
335 for (
int i = 0; i < 480; ++i)
337 for (
int j = 0; j < 640; ++j)
339 memcpy(&depthData[ind], &
crt_depth_images[rid].ptr<short>(i)[j],
sizeof(
short));
347 printf(
"depth data %d byte send back done. rtnCode = %d\n", data_len, rtnCode);
358 printf(
"this method is abandoned");
367 printf(
"\ngetPose: ...\n");
368 int data_len = 7 *
sizeof(float) *
rbtnum;
369 char* poseData = (
char *)malloc(data_len);
373 poseData = (
char *)malloc(data_len);
377 for (
int rid = 0; rid <
rbtnum; ++rid)
380 for (
int i = 0; i < 7; ++i)
382 memcpy(&poseData[ind], &
pose[i],
sizeof(
float));
390 for (
int rid = 0; rid <
rbtnum; ++rid)
392 for (
int i = 0; i < 7; ++i)
395 memcpy(&temp, &poseData[ind],
sizeof(
float));
402 printf(
"getPose: done.\n");
406 void goToPose(
float x0 ,
float y0,
float qx0,
float qy0,
float qz0,
float qw0,
407 float x1 ,
float y1,
float qx1,
float qy1,
float qz1,
float qw1,
408 float x2 ,
float y2,
float qx2,
float qy2,
float qz2,
float qw2){
409 printf(
"\ngoToPose\n");
414 float originTheta0 = acos(
pose[6])*2;
416 originTheta0 = -originTheta0;
417 float objectTheta0 = acos(qw0)*2;
419 objectTheta0 = -objectTheta0;
420 float dTheta0 = objectTheta0 - originTheta0;
425 float originTheta1 = acos(
pose[6])*2;
427 originTheta1 = -originTheta1;
428 float objectTheta1 = acos(qw1)*2;
430 objectTheta1 = -objectTheta1;
431 float dTheta1 = objectTheta1 - originTheta1;
436 float originTheta2 = acos(
pose[6])*2;
438 originTheta2 = -originTheta2;
439 float objectTheta2 = acos(qw2)*2;
441 objectTheta2 = -objectTheta2;
442 float dTheta2 = objectTheta2 - originTheta2;
445 for (
int i = 0; i <
times; ++i)
447 float ox = 0.0, oy = 0.0, oz = 1.0;
450 float crtTheta0 = acos(
pose[6])*2;
452 crtTheta0 = -crtTheta0;
453 float temp_theta0 = crtTheta0 + dTheta0/
times;
457 float crtTheta1 = acos(
pose[6])*2;
459 crtTheta1 = -crtTheta1;
460 float temp_theta1 = crtTheta1 + dTheta1/
times;
464 float crtTheta2 = acos(
pose[6])*2;
466 crtTheta2 = -crtTheta2;
467 float temp_theta2 = crtTheta2 + dTheta2/
times;
479 for (
int i = 0; i <
times; ++i){
482 float tx0 =
pose[0] + dx0;
483 float ty0 =
pose[1] + dy0;
486 float tx1 =
pose[0] + dx1;
487 float ty1 =
pose[1] + dy1;
490 float tx2 =
pose[0] + dx2;
491 float ty2 =
pose[1] + dy2;
504 printf(
"goToPose: done.\n");
510 printf(
"\nfunc move_to_views begin\n");
513 int data_len =
rbtnum * 7 *
sizeof(float);
514 char* poseData = (
char *)malloc(data_len);
518 poseData = (
char *)malloc(data_len);
521 int rcv_len =
recvData(client_fd, poseData, data_len);
523 float pass_pose[
rbtnum][7];
527 for (
int id = 0;
id <
rbtnum; ++id)
530 for (
int i = 0; i < 7; ++i)
532 memcpy(&set_pose[i], &poseData[ind],
sizeof(
float));
533 memcpy(&pass_pose[
id][i], &poseData[ind],
sizeof(
float));
537 set_pose[0], set_pose[1], set_pose[2],
538 set_pose[3], set_pose[4], set_pose[5], set_pose[6]);
547 printf(
"func move_to_views end\n\n");
560 printf(
"\nsetPose\n");
561 int data_len =
rbtnum * 7 *
sizeof(float);
562 char* poseData = (
char *)malloc(data_len);
566 poseData = (
char *)malloc(data_len);
568 int rcv_len =
recvData(client_fd, poseData, data_len);
569 float pass_pose[
rbtnum][7];
571 for (
int id = 0;
id <
rbtnum; ++id)
574 for (
int i = 0; i < 7; ++i)
576 memcpy(&set_pose[i], &poseData[ind],
sizeof(
float));
577 memcpy(&pass_pose[
id][i], &poseData[ind],
sizeof(
float));
582 pass_pose[0][0], pass_pose[0][1], pass_pose[0][3], pass_pose[0][4], pass_pose[0][5], pass_pose[0][6],
583 pass_pose[1][0], pass_pose[1][1], pass_pose[1][3], pass_pose[1][4], pass_pose[1][5], pass_pose[1][6],
584 pass_pose[2][0], pass_pose[2][1], pass_pose[2][3], pass_pose[2][4], pass_pose[2][5], pass_pose[2][6]);
586 printf(
"\nsetPose: done.\n");
887 printf(
"scanning surroundings...\n");
890 for (
int i = 0; i < 6; ++i)
892 for (
int rid = 0; rid <
rbtnum; ++rid)
895 float originTheta = acos(
pose[6])*2;
897 originTheta = -originTheta;
898 float dir_theta = originTheta+
PI/3;
900 dir_theta = -
PI + dir_theta -
PI;
902 0.0*sin(dir_theta/2), 0.0*sin(dir_theta/2), 1.0*sin(dir_theta/2), cos(dir_theta/2));
904 printf(
"robot_%d turned 60 degree.\n", rid);
907 printf(
"ros sleep and spin once to get pose and rgbd...\n");
926 int data_len =
rbtnum*2*
sizeof(float);
928 recvData(client_fd, otp_data, data_len);
932 for (
int rid = 0; rid <
rbtnum; ++rid)
935 memcpy(&x, &otp_data[ind],
sizeof(
float));
937 memcpy(&y, &otp_data[ind],
sizeof(
float));
959 for (
int rid = 0; rid <
rbtnum; ++rid)
969 for (
int rid = 0; rid <
rbtnum; ++rid)
973 sprintf(topicName,
"camera%d/rgb/image_raw", rid);
979 sprintf(topicName,
"camera%d/depth/image_raw", rid);
993 int data_len =
sizeof(int);
995 recvData(client_fd, recv_data, data_len);
997 memcpy(&number, &recv_data[0],
sizeof(
int));
1000 printf(
"changed robot number: %d\n",
rbtnum);
1007 int client = *(
int *)ptr;
1012 printf(
"wait for a command...\n");
1015 printf(
"message: %s\n", message);
1016 if(message!=NULL&&strlen(message)!=0)
1018 printf(
"command message: %c\n", message[0]);
1023 printf(
"ask for depth\n");
1029 printf(
"ask for pose\n");
1035 printf(
"ask to set pose\n");
1041 printf(
"ask for rgbd\n");
1047 printf(
"ask to set path\n");
1053 printf(
"set up surroundings\n");
1059 printf(
"ask to set task positions\n");
1065 printf(
"move_to_views\n");
1071 printf(
"command: stop the socket thread\n");
1077 printf(
"check robot number\n");
1083 printf(
"invalid command\n");
1091 printf(
"thread stop done.\n");
1098 printf(
"this new workspace\n");
1104 it =
new image_transport::ImageTransport(n);
1112 ifstream ifs(
"/home/bamboo/catkin_ws/src/virtual_scan/config_nrbt.txt");
1115 printf(
"robot number = %d\n", rbtnum);
1125 for (
int rid = 0; rid <
rbtnum; ++rid)
1135 for (
int rid = 0; rid <
rbtnum; ++rid)
1138 char topicName[100];
1139 sprintf(topicName,
"camera%d/rgb/image_raw", rid);
1144 char topicName[100];
1145 sprintf(topicName,
"camera%d/depth/image_raw", rid);
1156 gclient = n.
serviceClient<gazebo_msgs::GetModelState>(
"/gazebo/get_model_state");
1157 sclient = n.
serviceClient<gazebo_msgs::SetModelState>(
"/gazebo/set_model_state");
1164 if ((
sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
1171 my_addr.sin_addr.s_addr = INADDR_ANY;
1173 if (bind(
sockfd, (
struct sockaddr *)&
my_addr,
sizeof(
struct sockaddr)) == -1)
1188 int keepInterval = 5;
1190 setsockopt(
client_fd, SOL_SOCKET, SO_KEEPALIVE, (
void *)&keepAlive,
sizeof(keepAlive));
1191 setsockopt(
client_fd, SOL_TCP, TCP_KEEPIDLE, (
void*)&keepIdle,
sizeof(keepIdle));
1192 setsockopt(
client_fd, SOL_TCP, TCP_KEEPINTVL, (
void *)&keepInterval,
sizeof(keepInterval));
1193 setsockopt(
client_fd, SOL_TCP, TCP_KEEPCNT, (
void *)&keepCount,
sizeof(keepCount));
1199 if(setsockopt(
sockfd, IPPROTO_TCP, TCP_NODELAY, (
char*)&flag,
sizeof(
int))<0){
1200 printf(
"disable nagle failed\n");
1208 printf(
"%s\n",
"waiting for a connection");
1218 printf(
"%s\n",
"received a connection");
1224 int keepInterval = 5;
1226 setsockopt(
client_fd, SOL_SOCKET, SO_KEEPALIVE, (
void *)&keepAlive,
sizeof(keepAlive));
1227 setsockopt(
client_fd, SOL_TCP, TCP_KEEPIDLE, (
void*)&keepIdle,
sizeof(keepIdle));
1228 setsockopt(
client_fd, SOL_TCP, TCP_KEEPINTVL, (
void *)&keepInterval,
sizeof(keepInterval));
1229 setsockopt(
client_fd, SOL_TCP, TCP_KEEPCNT, (
void *)&keepCount,
sizeof(keepCount));
1235 if(setsockopt(
client_fd, IPPROTO_TCP, TCP_NODELAY, (
char*)&flag,
sizeof(
int))<0){
1236 printf(
"disable nagle failed\n");
1244 printf(
"Create pthread error: %s\n", strerror(ret));
1248 printf(
"succeed connected.\n");
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
int recvData(const int client_fd, char buf[], int len)
cv::Mat shortImg(480, 640, CV_16UC1)
vector< PositionInGazebo > task_poses
int main(int argc, char **argv)
void change_robot_number_local(int number)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void setForPose(int id, float x, float y, float z, float qx, float qy, float qz, float qw)
bool call(MReq &req, MRes &res)
bool move_to_views(int client_fd)
bool getRGBD(int client_fd)
vector< image_transport::Subscriber > subsColor(rbtnum)
bool setTaskPositions(int client_fd)
ros::ServiceClient gclient
void depthImageCallback(const sensor_msgs::ImageConstPtr &msg, const std::string &rbtID)
int sendTotalData(const int client_fd, const char *buf, const int len)
vector< vector< PositionInGazebo > > path_poses
bool getDepth(int client_fd)
void infoCallback(const sensor_msgs::CameraInfoConstPtr &msg)
ros::ServiceClient sclient
image_transport::ImageTransport * it
bool getPose(int client_fd)
bool sendData(const int client_fd, const char *ch, const int len)
void goToPose(float x0, float y0, float qx0, float qy0, float qz0, float qw0, float x1, float y1, float qx1, float qy1, float qz1, float qw1, float x2, float y2, float qx2, float qy2, float qz2, float qw2)
void rgbImageCallback(const sensor_msgs::ImageConstPtr &msg, const std::string &rbtID)
bool change_robot_number(int client_fd)
bool scanSurroundings(int client_fd)
PositionInGazebo(float ix, float iy, float iz)
vector< cv::Mat > crt_rgb_images(rbtnum)
struct sockaddr_in remote_addr
bool setPath(int client_fd)
const float camera_factor
struct sockaddr_in my_addr
ROSCPP_DECL void spinOnce()
vector< cv::Mat > crt_depth_images(rbtnum)
bool setPose(int client_fd)
vector< image_transport::Subscriber > subsDepth(rbtnum)