Writing a CSV File

From Mech
Revision as of 11:05, 13 October 2020 by Lynch (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search
Ur5-img.png

Several of the CoppeliaSim simulation scenes require a plain-text comma-separated values (CSV) file as input. A CSV file may represent the trajectory of a robot, where each row contains the configuration of the robot at an instant in time, with a fixed time between each row. If the robot has joints, then each row has numbers separated by commas. For example, five rows of a CSV file for a six-joint robot might look like this:

2.950000, -1.570000, 0.000000, 0.000000, 0.000000, 0.000000
2.987484, -1.540050, 0.019967, 0.019992, 0.012495, 0.009996
3.024875, -1.510399, 0.039734, 0.039933, 0.024958, 0.019967
3.062079, -1.481344, 0.059104, 0.059775, 0.037360, 0.029888
3.099002, -1.453174, 0.077884, 0.079468, 0.049667, 0.039734

where each number is a joint angle in radians.

Below are code snippets in Python, MATLAB, and Mathematica that you can modify to create your own CSV files.

This page contains information on getting started quickly with CoppeliaSim. This page contains a number of scenes that accept CSV file inputs for visualization of robot trajectories.

Python

import numpy as np

# Generate random 3x4 matrix of floats y, 3x1 vector of ints d
y = np.random.rand(3, 4)
d = np.random.randint(-100, 100, 3)

# Open a file for output
# Overwrite
f = open("output.csv", "w") 
# Append
#f = open("output.csv", "a")

# For loop running 3 times to print each csv row
for i in range(len(d)):
    output = " %10.6f, %10.6f, %10.6f, %10.6f, %d\n" % (y[i,0], y[i,1], y[i,2], y[i,3], d[i])
    f.write(output)
    
# close file
f.close()

The code below is a somewhat simpler version.

import numpy as np

# Generate random 3x4 matrix of floats y, 3x1 vector of ints d
y = np.random.rand(3, 4)
d = np.random.randint(-100, 100, 3)

# Set number precision
y = np.round(y, 6)

# Overwrite csv file
np.savetxt("output.csv", np.asarray(np.c_[y, d]), delimiter = ",") 

MATLAB

% Generate random 3x4 matrix of floats y, 3x1 vector of ints d
y = rand(3, 4);
d = randi([-100, 100], 3, 1);

% Open a file for output
% Overwrite
f = fopen('output.csv', 'w');
% Append
%f = fopen('output.csv', 'a');

% For loop running 3 times to print each csv row
for i = 1: length(d)
    fprintf(f, ' %10.6f, %10.6f, %10.6f, %10.6f, %d\n', y(i, :), d(i));
end

% Close file
fclose(f);

The code below is a somewhat simpler version.

% Generate random 3x4 matrix of floats y, 3x1 vector of ints d
y = rand(3, 4);
d = randi([-100, 100], 3, 1);

% Set number precision
y = round(y, 6);

% Overwrite csv file
csvwrite('output.csv', [y, d]);

Mathematica

(* Generate random 3x4 matrix of floats y,3x1 vector of ints d *)

y = RandomReal[1, {3, 4}];
d = RandomInteger[{-100, 100}, {3, 1}];

(* Open a file for output *)
(* Overwrite *)

f = OpenWrite[FileNameJoin[{NotebookDirectory[], "output.csv"}]];
(* Append *)
(* \
f=OpenAppend[FileNameJoin[{NotebookDirectory[],"output.csv"}]]; *)

(* For loop running 3 times to print each csv row *)

Do[WriteString[f, 
   ExportString[{Flatten[{SetAccuracy[y[[i, ;;]], 6], d[[i]]}]}, 
    "CSV"]], {i, Length[d]}];

(* Close file *)
Close[f];

The code below is a somewhat simpler version.

(* Generate random 3x4 matrix of floats y,3x1 vector of ints d *)

y = RandomReal[1, {3, 4}];
d = RandomInteger[{-100, 100}, {3, 1}];

(* Set number precision *)
y = SetAccuracy[y, 6];

(* Overwrite csv file *)

Export[FileNameJoin[{NotebookDirectory[], "output.csv"}], 
  ArrayFlatten[{{y, d}}], "CSV"];