Skip to content

Commit d05885a

Browse files
author
alireza@general
committed
feat: stereo camera is now publishing pointcloud from the front vga only
1 parent dcd6db6 commit d05885a

13 files changed

Lines changed: 255 additions & 23 deletions

File tree

include/dji_osdk_ros/dji_vehicle_node.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@
170170
#include <dji_osdk_ros/WaypointV2MissionEventPush.h>
171171
#include <dji_osdk_ros/WaypointV2MissionStatePush.h>
172172

173+
#include <sensor_msgs/CameraInfo.h>
174+
175+
#include <dji_osdk_ros/stereo_utility/m300_stereo_param_tool.hpp>
176+
173177
#define C_EARTH (double)6378137.0
174178
#define C_PI (double)3.141592653589793
175179
#define DEG2RAD(DEG) ((DEG) * ((C_PI) / (180.0)))
@@ -197,6 +201,9 @@ namespace dji_osdk_ros
197201
bool initTopic();
198202
bool initDataSubscribeFromFC();
199203
bool cleanUpSubscribeFromFC();
204+
#ifdef ADVANCED_SENSING
205+
void publishCameraInfo(const std_msgs::Header &header);
206+
#endif
200207
protected:
201208
/*! services */
202209
/*! for general */
@@ -332,13 +339,18 @@ namespace dji_osdk_ros
332339
ros::Publisher stereo_240p_front_depth_publisher_;
333340
ros::Publisher stereo_vga_front_left_publisher_;
334341
ros::Publisher stereo_vga_front_right_publisher_;
342+
ros::Publisher left_camera_info_pub_;
343+
ros::Publisher right_camera_info_pub_;
344+
ros::Timer info_timer_;
335345
#endif
336346

337347
//waypointV2
338348
ros::Publisher waypointV2_mission_state_publisher_;
339349
ros::Publisher waypointV2_mission_event_publisher_;
340350

341351
protected:
352+
353+
void initTimer();
342354
/*! for general */
343355
bool getDroneTypeCallback(dji_osdk_ros::GetDroneType::Request &request,
344356
dji_osdk_ros::GetDroneType::Response &response);
@@ -413,6 +425,10 @@ namespace dji_osdk_ros
413425
bool getM300StereoParamsCallback(dji_osdk_ros::GetM300StereoParams::Request& request,
414426
dji_osdk_ros::GetM300StereoParams::Response& response);
415427
void publishAdvancedSeningData();
428+
429+
//void infoTimerCB(const ros::TimerEvent &even);
430+
431+
416432
#endif
417433
/*! for mission service callback*/
418434
// mission manager

include/dji_osdk_ros/stereo_utility/m300_stereo_param_tool.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "dji_vehicle.hpp"
55
#include "dji_perception.hpp"
66
#include "dji_osdk_ros/stereo_utility/config.hpp"
7+
#include <sensor_msgs/CameraInfo.h>
78

89
using namespace M210_STEREO;
910
using namespace DJI;
@@ -23,9 +24,13 @@ class M300StereoParamTool
2324
double rotaionLeftInRight[9];
2425
double translationLeftInRight[3];
2526
} DoubleCamParamType;
26-
27+
28+
2729
/*!*/
2830
Perception::CamParamType getM300stereoParams(Perception::DirectionType direction);
31+
32+
void getM300stereoCameraInfo(Perception::CamParamType param, sensor_msgs::CameraInfo &left,
33+
sensor_msgs::CameraInfo &right);
2934

3035
bool createStereoParamsYamlFile(std::string fileName,
3136
Perception::CamParamType param);

include/dji_osdk_ros_obsoleted/dji_sdk/dji_sdk_node.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#include <dji_osdk_ros/StereoDepthSubscription.h>
7878
#include <dji_osdk_ros/StereoVGASubscription.h>
7979
#include <dji_osdk_ros/SetupCameraStream.h>
80+
#include <sensor_msgs/CameraInfo.h>
8081
#endif
8182

8283
//! SDK library
@@ -229,6 +230,7 @@ class DJISDKNode
229230
dji_osdk_ros::StereoVGASubscription::Response& response);
230231
bool setupCameraStreamCallback(dji_osdk_ros::SetupCameraStream::Request& request,
231232
dji_osdk_ros::SetupCameraStream::Response& response);
233+
void publishCameraInfo(const std_msgs::Header &header);
232234
#endif
233235

234236
//! data broadcast callback
@@ -343,6 +345,8 @@ class DJISDKNode
343345
ros::ServiceServer subscribe_stereo_depth_server;
344346
ros::ServiceServer subscribe_stereo_vga_server;
345347
ros::ServiceServer camera_stream_server;
348+
ros::Publisher left_camera_info_pub_;
349+
ros::Publisher right_camera_info_pub_;
346350
#endif
347351

348352
//! flight control subscribers

launch/dji_vehicle_node.launch

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
<param name="acm_name" type="string" value="/dev/ttyACM0"/>
55
<param name="serial_name" type="string" value="/dev/ttyUSB0"/>
66
<param name="baud_rate" type="int" value="921600"/>
7-
<param name="app_id" type="int" value="12345"/>
7+
<param name="app_id" type="int" value= "1023987"/>
88
<param name="app_version" type="int" value="1"/>
99
<param name="align_time" type="bool" value="false"/>
10-
<param name="enc_key" type="string" value="abc123"/>
10+
<param name="enc_key" type="string" value="afe96210ea022d24e17808d30229be0cfa5d41d75bb37f4965f1502b6d3cc62b"/>
1111
<param name="use_broadcast" type="bool" value="false"/>
12+
<param name="dxc" type="bool" value="false"/>
1213
</node>
1314
</launch>

launch/stereo_camera.launch

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0"?>
2+
<launch>
3+
<remap from="/left/image_raw" to="/dji_osdk_ros/stereo_vga/left/image_raw"/>
4+
<remap from="/left/camera_info" to="/dji_osdk_ros/stereo_vga/left/camera_info"/>
5+
<remap from="/right/image_raw" to="/dji_osdk_ros/stereo_vga/right/image_raw"/>
6+
<remap from="/right/camera_info" to="/dji_osdk_ros/stereo_vga/right/camera_info"/>
7+
<node pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc"/>
8+
</launch>

src/dji_osdk_ros/dji_vehicle_node.cpp

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@
3030
#include <dji_osdk_ros/dji_vehicle_node.h>
3131
#include <dji_osdk_ros/vehicle_wrapper.h>
3232

33-
#ifdef OPEN_CV_INSTALLED
33+
/*#ifdef OPEN_CV_INSTALLED
34+
#include <dji_osdk_ros/stereo_utility/m300_stereo_param_tool.hpp>
35+
#endif*/
3436
#include <dji_osdk_ros/stereo_utility/m300_stereo_param_tool.hpp>
37+
#include <vector>
38+
39+
#ifdef ADVANCED_SENSING
40+
#include <sensor_msgs/CameraInfo.h>
3541
#endif
3642

37-
#include <vector>
3843
//CODE
3944
using namespace dji_osdk_ros;
4045
#define M300_FRONT_STEREO_PARAM_YAML_NAME "m300_front_stereo_param.yaml"
@@ -83,6 +88,7 @@ VehicleNode::VehicleNode():telemetry_from_fc_(TelemetryType::USE_ROS_BROADCAST),
8388
initCameraModule();
8489
initService();
8590
initTopic();
91+
initTimer();
8692
}
8793

8894
VehicleNode::~VehicleNode()
@@ -271,6 +277,7 @@ void VehicleNode::initService()
271277
subscribe_stereo_240p_server_ = nh_.advertiseService("stereo_240p_subscription", &VehicleNode::stereo240pSubscriptionCallback, this);
272278
subscribe_stereo_depth_server_ = nh_.advertiseService("stereo_depth_subscription", &VehicleNode::stereoDepthSubscriptionCallback,this);
273279
subscribe_stereo_vga_server_ = nh_.advertiseService("stereo_vga_subscription", &VehicleNode::stereoVGASubscriptionCallback, this);
280+
get_m300_stereo_params_server_ = nh_.advertiseService("get_m300_stereo_params", &VehicleNode::getM300StereoParamsCallback, this);
274281
#ifdef OPEN_CV_INSTALLED
275282
/*! @brief
276283
* get m300 stereo params server
@@ -322,6 +329,14 @@ void VehicleNode::initService()
322329
ROS_INFO_STREAM("Services startup!");
323330
}
324331

332+
void VehicleNode::initTimer()
333+
{
334+
#ifdef ADVANCED_SENSING
335+
//info_timer_ = nh_.createTimer(ros::Duration(0.05), &VehicleNode::infoTimerCB, this);
336+
#endif
337+
}
338+
339+
325340
bool VehicleNode::initTopic()
326341
{
327342
attitude_publisher_ = nh_.advertise<geometry_msgs::QuaternionStamped>("dji_osdk_ros/attitude", 10);
@@ -396,8 +411,11 @@ bool VehicleNode::initTopic()
396411
stereo_240p_down_front_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_240p_down_front_images", 10);
397412
stereo_240p_down_back_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_240p_down_back_images", 10);
398413
stereo_240p_front_depth_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_240p_front_depth_images", 10);
399-
stereo_vga_front_left_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_vga_front_left_images", 10);
400-
stereo_vga_front_right_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_vga_front_right_images", 10);
414+
stereo_vga_front_left_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_vga_front/left/image_raw", 10);
415+
stereo_vga_front_right_publisher_ = nh_.advertise<sensor_msgs::Image>("dji_osdk_ros/stereo_vga_front/right/image_raw", 10);
416+
left_camera_info_pub_ = nh_.advertise<sensor_msgs::CameraInfo>("/dji_osdk_ros/stereo_vga_front/left/camera_info",10);
417+
right_camera_info_pub_ = nh_.advertise<sensor_msgs::CameraInfo>("/dji_osdk_ros/stereo_vga_front/right/camera_info",10);
418+
401419
#endif
402420

403421
waypointV2_mission_state_publisher_ = nh_.advertise<dji_osdk_ros::WaypointV2MissionStatePush>("dji_osdk_ros/waypointV2_mission_state", 10);
@@ -914,8 +932,6 @@ bool VehicleNode::stereoVGASubscriptionCallback(dji_osdk_ros::StereoVGASubscript
914932

915933
return true;
916934
}
917-
918-
#ifdef OPEN_CV_INSTALLED
919935
bool VehicleNode::getM300StereoParamsCallback(dji_osdk_ros::GetM300StereoParams::Request& request,
920936
dji_osdk_ros::GetM300StereoParams::Response& response)
921937
{
@@ -943,6 +959,34 @@ bool VehicleNode::getM300StereoParamsCallback(dji_osdk_ros::GetM300StereoParams:
943959

944960
return response.result;
945961
}
962+
#ifdef OPEN_CV_INSTALLED
963+
/*bool VehicleNode::getM300StereoParamsCallback(dji_osdk_ros::GetM300StereoParams::Request& request,
964+
dji_osdk_ros::GetM300StereoParams::Response& response)
965+
{
966+
ROS_INFO("called getM300StereoParamsCallback");
967+
968+
if(ptr_wrapper_ == nullptr)
969+
{
970+
ROS_ERROR_STREAM("Vehicle modules is nullptr");
971+
response.result = false;
972+
}
973+
974+
Vehicle* vehicle = ptr_wrapper_->getVehicle();
975+
M300StereoParamTool *tool = new M300StereoParamTool(vehicle);
976+
Perception::CamParamType stereoParam =
977+
tool->getM300stereoParams(Perception::DirectionType::RECTIFY_FRONT);
978+
if (tool->createStereoParamsYamlFile(M300_FRONT_STEREO_PARAM_YAML_NAME, stereoParam))
979+
{
980+
tool->setParamFileForM300(M300_FRONT_STEREO_PARAM_YAML_NAME);
981+
response.result = true;
982+
}
983+
else
984+
{
985+
response.result = false;
986+
}
987+
988+
return response.result;
989+
}*/
946990
#endif
947991
#endif
948992

src/dji_osdk_ros/modules/CMakeLists.txt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,15 @@ if(darknet_ros_FOUND)
8484
set(ENABLE_DARKNET_ROS 1 CACHE INTERNAL "ENABLE_DARKNET_ROS")
8585
endif()
8686

87-
if (OPEN_CV_3_3_0_INSTALLED AND FOUND_OPENCV_VIZ)
88-
FILE(GLOB SOURCES *.cc *.cpp *.c *.cxx stereo_utility/*cpp)
89-
include_directories(../../../include/dji_osdk_ros/stereo_utility)
90-
else()
91-
FILE(GLOB SOURCES *.cc *.cpp *.c *.cxx)
92-
endif()
93-
87+
#if (OPEN_CV_3_3_0_INSTALLED AND FOUND_OPENCV_VIZ)
88+
# FILE(GLOB SOURCES *.cc *.cpp *.c *.cxx stereo_utility/*cpp)
89+
# include_directories(../../../include/dji_osdk_ros/stereo_utility)
90+
# else()
91+
# FILE(GLOB SOURCES *.cc *.cpp *.c *.cxx)
92+
#endif()
93+
FILE(GLOB SOURCES *.cc *.cpp *.c *.cxx stereo_utility/*cpp)
94+
include_directories(../../../include/dji_osdk_ros/stereo_utility)
95+
9496
ADD_LIBRARY(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES})
9597
MESSAGE(STATUS "PROJECT_NAME: ${PROJECT_NAME}")
9698
MESSAGE(STATUS "DJIOSDK_LIB: ${DJIOSDK_LIBRARIES}")
@@ -114,4 +116,4 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})
114116

115117
if (OpenCV_FOUND)
116118
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
117-
endif ()
119+
endif ()

src/dji_osdk_ros/modules/dji_vehicle_node_publisher.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,8 +815,42 @@ void VehicleNode::publishVGAStereoImage(Vehicle* vehicle,
815815
img.header.frame_id = "vga_right";
816816
memcpy((char*)(&img.data[0]), recvFrame.recvData.stereoVGAImgData->img_vec[1], 480*640);
817817
node_ptr->stereo_vga_front_right_publisher_.publish(img);
818+
node_ptr->publishCameraInfo(img.header);
819+
818820
}
819821

822+
#ifdef ADVANCED_SENSING
823+
void VehicleNode::publishCameraInfo(const std_msgs::Header &header)
824+
{
825+
static bool isFirstTime = true;
826+
827+
static sensor_msgs::CameraInfo left_camera_info;
828+
static sensor_msgs::CameraInfo right_camera_info;
829+
830+
if(isFirstTime)
831+
{
832+
left_camera_info.distortion_model = right_camera_info.distortion_model = "plumb_bob";
833+
left_camera_info.width = right_camera_info.width = 640;
834+
left_camera_info.height = right_camera_info.height = 480;
835+
836+
837+
Vehicle* vehicle = ptr_wrapper_->getVehicle();
838+
M300StereoParamTool *tool = new M300StereoParamTool(vehicle);
839+
Perception::CamParamType stereoParam = tool->getM300stereoParams(Perception::DirectionType::RECTIFY_FRONT);
840+
841+
tool->getM300stereoCameraInfo(stereoParam, left_camera_info, right_camera_info);
842+
isFirstTime = false;
843+
}
844+
845+
left_camera_info.header = right_camera_info.header = header;
846+
left_camera_info.header.frame_id = "left_camera";
847+
right_camera_info.header.frame_id = "right_camera";
848+
left_camera_info_pub_.publish(left_camera_info);
849+
right_camera_info_pub_.publish(right_camera_info);
850+
851+
}
852+
#endif
853+
820854
void VehicleNode::publishMainCameraImage(CameraRGBImage rgbImg, void* userData)
821855
{
822856
VehicleNode *node_ptr = (VehicleNode *)userData;

src/dji_osdk_ros/modules/stereo_utility/m300_stereo_param_tool.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,71 @@ void M300StereoParamTool::PerceptionCamParamCB(
5858
}
5959
}
6060

61+
void M300StereoParamTool::getM300stereoCameraInfo(Perception::CamParamType param, sensor_msgs::CameraInfo &left,
62+
sensor_msgs::CameraInfo &right)
63+
{
64+
DoubleCamParamType doubleCameraParams;
65+
doubleCameraParams.direction = param.direction;
66+
67+
/*! Convert float camera parameters matrix to be double matrix */
68+
for (int i = 0; i < sizeof(param.leftIntrinsics); i++)
69+
{
70+
doubleCameraParams.leftIntrinsics[i] = (double)param.leftIntrinsics[i];
71+
doubleCameraParams.rightIntrinsics[i] = (double)param.rightIntrinsics[i];
72+
doubleCameraParams.rotaionLeftInRight[i] = (double)param.rotaionLeftInRight[i];
73+
}
74+
for (int i = 0; i < sizeof(param.translationLeftInRight); i++)
75+
doubleCameraParams.translationLeftInRight[i] = (double)param.translationLeftInRight[i];
76+
77+
cv::Mat leftCameraIntrinsicMatrix(3, 3, CV_64F, doubleCameraParams.leftIntrinsics);
78+
cv::Mat rightCameraIntrinsicMatrix(3, 3, CV_64F, doubleCameraParams.rightIntrinsics);
79+
80+
81+
//cv::Mat leftDistCoeffs = cv::Mat::zeros(5, 1, CV_64F);
82+
//cv::Mat rightDistCoeffs = cv::Mat::zeros(5, 1, CV_64F);
83+
//loading the distortion matrix
84+
left.D = std::vector<double>(5,0.0);
85+
right.D = std::vector<double>(5,0.0);
86+
87+
cv::Mat leftRectificationMatrix = cv::Mat::eye(3, 3, CV_64F);
88+
cv::Mat rightRectificationMatrix = cv::Mat::eye(3, 3, CV_64F);
89+
cv::Mat translationLeftInRight(3, 1, CV_64F, doubleCameraParams.translationLeftInRight);
90+
cv::Mat leftProjectionMatrix(leftCameraIntrinsicMatrix.rows, leftCameraIntrinsicMatrix.cols + translationLeftInRight.cols, CV_64F);
91+
cv::hconcat(leftCameraIntrinsicMatrix, translationLeftInRight, leftProjectionMatrix);
92+
cv::Mat rightProjectionMatrix(rightCameraIntrinsicMatrix.rows, rightCameraIntrinsicMatrix.cols + translationLeftInRight.cols, CV_64F);
93+
cv::hconcat(rightCameraIntrinsicMatrix, translationLeftInRight, rightProjectionMatrix);
94+
95+
//loading the rectification matrix
96+
for(int r = 0; r < leftRectificationMatrix.rows; r++)
97+
{
98+
for(int c = 0; c < leftRectificationMatrix.cols; c++)
99+
{
100+
left.R[r*leftCameraIntrinsicMatrix.cols + c] = leftRectificationMatrix.at<double>(r,c);
101+
right.R[r*rightRectificationMatrix.cols + c] = rightRectificationMatrix.at<double>(r,c);
102+
}
103+
}
104+
105+
//loading the camera intrinsic matrix
106+
for(int r = 0; r < leftCameraIntrinsicMatrix.rows; r++)
107+
{
108+
for(int c = 0; c < leftCameraIntrinsicMatrix.cols; c++)
109+
{
110+
left.K[r*leftCameraIntrinsicMatrix.cols + c] = leftCameraIntrinsicMatrix.at<double>(r,c);
111+
right.K[r*rightCameraIntrinsicMatrix.cols + c] = rightCameraIntrinsicMatrix.at<double>(r,c);
112+
}
113+
}
114+
115+
//loading the projection matrix
116+
for(int r = 0; r < leftProjectionMatrix.rows; r++)
117+
{
118+
for(int c = 0; c < leftProjectionMatrix.cols; c++)
119+
{
120+
left.P[r*leftProjectionMatrix.cols + c] = leftProjectionMatrix.at<double>(r,c);
121+
right.P[r*rightProjectionMatrix.cols + c] = rightProjectionMatrix.at<double>(r,c);
122+
}
123+
}
124+
}
125+
61126
bool M300StereoParamTool::createStereoParamsYamlFile(std::string fileName,
62127
Perception::CamParamType param) {
63128
DoubleCamParamType doubleCameraParams;

src/dji_osdk_ros/modules/stereo_utility/point_cloud_viewer.cpp renamed to src/dji_osdk_ros/modules/stereo_utility/point_cloud_viewer.cpp.bak

File renamed without changes.

0 commit comments

Comments
 (0)