# Tag Info

12

Start CLion from a commandline with your sourced ROS workspace (i.e. after calling source devel/setup.bash) Open a project's CMakeLists.txt, and tell it to open it as a project rather than as a file. That's it, you've got your workspace integrated :) Debugging: Debugging built files (nodes which you run through rosrun) is easy, you just normally run them ...

6

I agree with SteveO that there is nothing wrong with reinventing the wheel if you want to learn about wheels. And for a single application, 4 DoF arm, the IK is probably not too hard. But I feel like I should mention that most of the kinematics libraries out there are mostly targeted towards Linux. And as such, probably not too hard to compile from ...

6

Integrating CLion with ROS is actually straight forward and works out of the box if one knows how to do it: With your console, go into your ROS workspace and source the respective setup.bash file. Go to the src directory of your workspace. Start CLion from the console from your src directory. Close any open projects in CLion and select Import Project from ...

5

It is rather straightforward to implement inverse kinematics for a particular manipulator in C++. Of course, you need to begin with the inverse kinematic equations themselves. Putting those into code will only involve a few trigonometric functions such as acos, asin, and atan2 (use atan2 instead of atan), and probably a couple of square and square root ...

4

The best way to understand forward and inverse kinematics is to write a library for its own. A good starting point is to implement Cyclic Coordinate Descent. So called "ready-to-run" librarys like OpenRave or OMPL have an extensive C++ tutorial section too but are notorius difficult to install. Most of them only run under linux, and are not even part of ...

4

I have a library called grl which integrates control of a KUKA iiwa in C++. Right now the most reliable mechanism I've found for control is to receive state over FRI, then send state via Java. All the tools necessary to do this are integrated into grl. While I've been able to receive state over FRI nicely, sending FRI commands so the robot drives reliably ...

4

If you make a career of robotics, you will come in contact with a lot of languages, a lot of libraries, and a lot of systems. The more you know about the fundamentals, the easier it will be to adjust to something new. Likewise, if you focus your learning on whatever project or context is relevant to you at any given moment, it's more likely to stick with ...

4

At first, I did not go trough your code to check for errors in the formulas but from a high level perspective this seems ok. Therefore, your position controller is fine. What you lack is a lowlevel controller for the PWM signal. This controller should take the error of w_l - e.g. e_w_l - and w_r and provide a duty cycle accordingly. For that you should ...

4

Robotics is a mixture of things like mechanical engineering, electronics engineering and software engineering! Knowing C++ is a big head start in this area! Because I strongly believe that amongst all three engineering categories software is the one thing you will spend the most time on when developing an autonomous robot. So to start, learn computer-aided ...

4

There's a lot of solutions out there already for this. I'll start by suggesting AR tags not QR tags. They're better optimized for localizing. The Alvar library is commonly used for tracking AR tags. http://virtual.vtt.fi/virtual/proj2/multimedia/alvar/ And there's a ROS package which wraps that and publishes the results as ROS messages. https://index.ros.org/...

3

I experimented a bit and here's what I think happens. When you run $rostopic echo /questions The /questions topic doesn't exist before you run the program. Maybe you cheat it by first running your programming, running this command and then running your program again, but this assertion is still true. So at the point when you run your program, rostopic is ... 3 Beaglebone USB When you plug a USB cable between the USB B plug of the Arduino Uno and the USB A plug of the Beaglebone Black, the Beaglebone should be able to talk and listen to it the same way any other Linux distribution talks and listens to any other CDC class USB peripheral. On the Beaglebone, a CDC class USB peripheral can be read an written to ... 3 To expand on Alexandre's answer: Controlling the arm with the Jacobian along an end-effector trajectory is one way to do it. However, this will not give you obstacle avoidance. Although you could manually check for collisions at each time step, but i imagine this could get ugly. Additionally, this is a gradient technique, so you will be constrained to the ... 3 What you are looking for is called serialization. Serialization is the process of creating a string (a serial stream of data) (not necessarily NUL-terminated) from arbitrary data. The issue serialization addresses is the fact that the same data are represented in different computers differently. For example, take this struct: struct A { unsigned int x; ... 3 It is a bit hard to know the exact cause of the error without having the (RobWork), I tried to install it following the link your provided, but I ran into some problems and I don't have the time to fix them at the moment. But I can point you to some issues that might be the source of your problem: The transform method you are given in this code doesn't have ... 3 Given a desired pose: $$T^{desired} = \begin{bmatrix} s_x&n_x&a_x&P_x\\ s_y&n_y&a_y&P_y\\ s_z&n_z&a_z&P_z\\ 0& 0& 0& 1 \end{bmatrix}$$ we know that this is given as follows: $$T^{desired} = {}^{0}T_{1}{}^{1}T_{2}{}^{2}T_{3}{}^{3}T_{4}{}^{4}... 3 Your Jacobian-based approach is great for velocity control, or when the manipulator is close to the original point. But remember, the Jacobian only gives a first-order approximation to the manipulator's motion. With the highly nonlinear kinematics of manipulators, accuracy will vary throughout the workspace, and will decrease as the step size between the ... 3 If you are already using Qt, then Q3 3D would be an obviuos choice for 3D representations. Gaming engines like Unity (C#/JavaScript) or the Unreal Engine (C++) are also a suitable choice for representing robots in 3D. You will find plenty of exmples like this. Using directly OpenGL is also an option, but if you want anything else then just simple 3D ... 3 This method is minimizing the reprojection error of the triangulated point. How to see this: Let P_i be the 3 \times 4 projection matrices, and let x_i \in \mathbb{R}^3 be the (homogenized coordinates of the) observations. This method is computing the matrix$$ A = \sum_{i=1}^n A_i^T A_i, $$where$$ A_i = P_i - x_i x_i^T P_i;$\$ and then it returns ...

3

There are a few dimensions to being a roboticist: is knowledge of theory about robot perception (understanding the world through sensors such as cameras, signal processing and machine learning), planning(how the robot should move) and action (how things move in space, kinematics, dynamics, control theory, reinforcement learning etc.). There are a lot of ...

3

Answers are inline Qn 1. Does kalman filter require constant time step? Correct it does not. The reason you may find in literature that it requires a constant time step has to do with with lack of computing power in the 60s-90s and the discretization of a continuous system. You can read more about this in something like this, or other books that deal ...

3

Don't disengage your controller. The purpose of a controller is not only to steer your system to the desired setpoint according to a predetermined dynamical response but also to counteract potential external factors that may impede this task. Think of a disturbance that will drive the system far from the setpoint once it has been reached. Thus, the ...

3

IMHO the main difference is, that inside function/method the first one (object) is allocated on the stack and destroyed after leaving the function, while the other (pointer) allocates its data on the heap, so it can be safely returned from the function and survive its end. It must be destroyed more explicitly, when you want to get rid of it. Allocating on ...

3

I find it easiest to make a class for stuff like this, where you have data you want to use between callbacks, or your want to publish a message inside of another callback. For example, your class might look something like (in the header:) class IMUIntegrator { public: void start(); private: void imu_callback(const your_imu::Message::...

2

It's python but easy to install: https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/pwm. Otherwise you can fopen files in the device tree and write to them, or you can open /dev/mem and directly access the registers for the PWM drivers. I strongly recommend using the first method it is far easier than the third and basically the ...

2

The library call could be as simple as these two OpenRave Python lines: robot.GetController().SetPath(traj) robot.WaitForController(0) Of course the types would have to match and all that. You would also have to write a controller plugin, which I have heard can be quite a bit of work. (These are just Python bindings for the C++ API, but I am not familiar ...

2

Cross post on YARP Q&A channel: https://github.com/robotology/QA/issues/54

2

You need real camera synchronization which means using cameras that both have external trigger capability (it is like the "remote shutter" on consumer/DSLRs). What you do is feed a common trigger signal to both cameras and sync them like that down to the sub-ms level (the accuracy largely depends on the camera HW but is usually very good, usually in us). ...

2

Some very general advice. My first impression from your question is that you are struggling with the fact that no hardware provides infinite resources. You can either slow down your control loops or look for better hardware (which may not exist). If your control has nested loops, then run each one a slow as possible. Are you controlling position at 20kHz? ...

2

I haven't used it personally (yet; it's only a matter of time), but I believe the Rigid Body Dynamics Library is what you're looking for - efficient forward and inverse kinematics. I did a lot of work with the underlying math behind that library, and even wound up (creating my account here to) asking a couple questions about it, one of which was answered by ...

Only top voted, non community-wiki answers of a minimum length are eligible