I need some clarifications about the Pose Tree (PANIC : Could not get the transformation odom_T_elbrus.)

Hello,
I am trying to get the position of my robot using the coordinates published in the pose tree by svo app.
When I call get_odom_T_elbrus or get_odom_T_left_camera in my codelet I get the following error :
PANIC engine/alice/hooks/pose_hook.cpp@29: Could not get the transformation odom_T_elbrus.
It’s my first time using pose tree so I guess I’m missing something pretty obvious but I found nothing useful in the Pose Doc nor in the forum post about reading svo output .
I only see left_camera and right_camera in the pose tree visualization in Isaac sight, nothing about svo, no odom nor elbrus…

Here is some of my code
In my JSON :

		"tracker": {
			"StereoVisualOdometry": {
				"horizontal_stereo_camera": true,
				"process_imu_readings": false,
				"lhs_camera_frame": "left_camera",
				"rhs_camera_frame": "right_camera"
			}
		},

In my cpp :

	const Pose3d svoPose = get_odom_T_elbrus(getTickTime());
	const double Tx= svoPose.translation.x();

In my hpp :
ISAAC_POSE3(odom, elbrus);

Same error using odom_T_robot, it’s logical I gess : nor odom nor robot is defined in my code but how to define or where to find the elbrus and odom ?
do I need to set PARAM as it is in the isaac::navigation::DifferentialBaseOdometry doc :
ISAAC_PARAM(std::string, odometry_frame, "odom");
ISAAC_PARAM(std::string, robot_frame, "robot"); ?

I managed to get the Pose3d coming from svo using :
In my cpp :

auto proto = rx_svoPose().getProto();
const double Tx = proto.getTranslation().getX();

In my Json :

{
"source": "tracker/StereoVisualOdometry/left_camera_pose",
"target": "comn/svoTX/svoPose"
}

Even if I don’t need the pose tree I wish to know how to get the transformation between my robot and the world origin using svo so I will let this post open by curiosity :D

Regards,
Planktos

Hey @Planktos

Any updates? Were you able to completely accomplish your purpose?
I want to get odometry readings from the svo application as well - to feed it into my robot for navigation purposes.

I haven’t tried it yet. Wanted to know if you had any success on this?

Hello @arjunsengupta98,
Yes it work well with the above node, let me know if you need help creating a svoTX cpp codelet, I could send you my codelet if needed.

Thanks @Planktos !
Yeah it would be great if you could share that. I’m on a really tight deadline and being a beginner, I’m struggling to understand the isaac codelets completely, so I can really use all the help that I can get! :D

Additionally, it would be absolutely awesome if you can take a look at and comment on a couple of my other questions -

You seem to be the only one who’s active on these threads. The Nvidia team hasn’t been responding (probably busy with GTC?).

Thanks again, I really appreciate it!

Sure thing @arjunsengupta98,
my code take the rotation and translation from svo then put it in a string like this “AAAASVOTx,Ty,Tz,Rw,…AAAA” and send the string, then I use a tcp node to send this string to my Qt GUI for processing.

Tell me if you need clarification on my code or any other advices.
About your other threads :

The DifferentialBaseOdometry definition is nowhere to be found.

He is probably located into perception.so, take a look at this post

Regards,
Planktos

This is the cpp :

#include "svoTX.hpp"

namespace isaac {

void svoTX::start() {
  tickOnMessage(rx_svoPose());
	
}
void svoTX::tick() {
	std::ostringstream ssx;
	std::string sx;
	auto proto = rx_svoPose().getProto();
	const double Tx = proto.getTranslation().getX();
	const double Ty = proto.getTranslation().getY();
	const double Tz = proto.getTranslation().getZ();
	const double Rw = proto.getRotation().getQ().getW();
	const double Rx = proto.getRotation().getQ().getX();
	const double Ry = proto.getRotation().getQ().getY();
	const double Rz = proto.getRotation().getQ().getZ();
	const double dof[7] = {Tx,Ty,Tz,Rw,Rx,Ry,Rz};
	std::string tcpstring;
	tcpstring += "AAAA";
	tcpstring += "SVO,";
	for(int i=0;i<7;i++){
		sx ="";ssx.str("");
		ssx << dof[i];
		sx = (ssx.str());
		tcpstring += sx;    
		tcpstring += ","; 
	}
	tcpstring += "AAAA";
	//std::printf("tcpstring:  %s  \n",tcpstring.c_str());
	auto tcp = tx_svoTCP().initProto();
	tcp.setMessage(tcpstring);
	tx_svoTCP().publish();
}
}  // namespace isaac

This is the hpp :

#pragma once
#include <string>
#include "engine/alice/alice_codelet.hpp"
#include "messages/detections.capnp.h"
#include "messages/ping.capnp.h"
#include "messages/math.hpp"

#include <sstream>


namespace isaac {

class svoTX : public alice::Codelet {
 public:
  void start() override;
  void tick() override;

  ISAAC_PROTO_RX(Pose3dProto, svoPose);
  ISAAC_PROTO_TX(PingProto, svoTCP);
  ISAAC_PARAM(int, svoLogLvl, 1);
};

}  // namespace isaac

ISAAC_ALICE_REGISTER_CODELET(isaac::svoTX);

@Planktos

Thanks a ton.

I had started some development in python, but looks like I should switch to C++ to directly use your codes. Might take me a while to get the hang of it.

Regards,
Arjun